• LINQ Dynamic 动态查询遇到的问题


    1          sb.Append(string.Format(" AND TFJ007.BTHDATE <= Convert.ToDateTime(\"{0}\"",
    2                                     DateTime.Now.AddYears(-50).ToShortDateString()));
    3 
    4         if (chkPayment.Items[0].Selected)
    5             sb.Append(string.Format(" AND TBL_CUSTOMER.PAYMENT = \'N\'  "));
    6         if (chkPayment.Items[1].Selected)
    7             sb.Append(string.Format(" AND TBL_CUSTOMER.PAYMENT = \'M\'  "));
    8 


    使用Dynamic.cs  报错
    The error thrown is:
    No property or field 'BTHDATE' exists in type 'EntitySet`1'

    后来查了下文档,得到以下结果:

    Based on your description, I think you are using LINQ to SQL and dynamic LINQ library.   As you have mentioned, the First extension method is not supported in dynamic LINQ. Because when searching methods of certain entity types, the dynamic LINQ library does not search the extension methods.  That’s reasonable, because the extension methods can be defined outside the property’s original assembly, and it is quite inefficiency and impossible to search the all the possible .NET assemblies.  

     

    One workaround is to modify the implementation of the dynamic LINQ library to let First extension method be found. We can modify the method FindMethod in Dynamic.cs.   If the method name is First, we find the certain extension method of the EntitySet.   For detail, please see

     

    ==================================================================
            int FindMethod(Type type, string methodName, bool staticAccess, Expression[] args, out MethodBase method)

            {

                if (methodName == "First")

                {

                    // Load the extension method's assembly

                    Assembly assembly = Assembly.LoadFrom(@"C:"Program Files"Reference Assemblies"Microsoft"Framework"v3.5"System.Core.dll");

     

                    // Retrieve all the method named First

                    var query = from t in assembly.GetTypes()

                                where t.Name == "Queryable"

                                from m in t.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)

                                where m.Name == "First"

                                select m;

                   

                    // Get the method

                    method = query.First();

     

                    return 1;          

                }

     

                BindingFlags flags = BindingFlags.Public | BindingFlags.DeclaredOnly |

                    (staticAccess ? BindingFlags.Static : BindingFlags.Instance);

                foreach (Type t in SelfAndBaseTypes(type)) {

                    MemberInfo[] members = t.FindMembers(MemberTypes.Method,

                        flags, Type.FilterNameIgnoreCase, methodName);

                    int count = FindBestMethod(members.Cast<MethodBase>(), args, out method);

                    if (count != 0) return count;

                }

                method = null;

                return 0;

            }
    ==================================================================

     

    Then we can use the First extension method on the EntitySet:

    ==================================================================

    string searchCondition = "EASummaries.First().AssessmentCompletedSuccessfully == Convert.ToBoolean(""True"")";

    var seesions = DAL.ExpertAssessments.DefaultIfEmpty().Where(searchCondition);
    ==================================================================

     

     

    Besides, if we know the which EntitySet we want to query, directly calling the First extension method is easier.

    ==================================================================

    string searchCondition = "AssessmentCompletedSuccessfully == Convert.ToBoolean(""True"")";

    var seesions = DAL.ExpertAssessments.DefaultIfEmpty().Select(e => e.EASummaries.First()).Where(searchCondition);
    ==================================================================


    原文地址:http://social.msdn.microsoft.com/Forums/en-US/linqprojectgeneral/thread/e3678e1e-b3f2-4bc3-9d6c-718dd874371d

    最后代码修改为



            if (chkIncludeOlder.Checked)
                sb.Append(
    string.Format(" AND TFJ007.First().BTHDATE <= Convert.ToDateTime(\"{0}\"",
                                        DateTime.Now.AddYears(
    -50).ToShortDateString()));

           
    if (chkPayment.Items[0].Selected)
                sb.Append(
    string.Format(" AND TBL_CUSTOMER.PAYMENT = \'N\'  "));
           
    if (chkPayment.Items[1].Selected)
                sb.Append(
    string.Format(" AND TBL_CUSTOMER.PAYMENT = \'M\'  "));

    运行正常。这个情况出现在1对多的关系中。

  • 相关阅读:
    winform中的 listview的使用的讲解。
    快乐的一天从AC开始 | 20210716 | P1345
    快乐的一天从AC开始 | 20210715 | P4643
    快乐的一天从AC开始 | 20210714 | P3594
    快乐的一天从AC开始 | 20210713 | P3557
    快乐的一天从AC开始 | 20210712 | P2251
    P7294-[USACO21JAN]Minimum Cost Paths P【单调栈】
    AT4353-[ARC101D]Robots and Exits【LIS】
    2021牛客暑期多校训练营9C-Cells【LGV引理,范德蒙德行列式】
    Loj#2880-「JOISC 2014 Day3」稻草人【CDQ分治,单调栈,二分】
  • 原文地址:https://www.cnblogs.com/yuanhuaming/p/1568301.html
Copyright © 2020-2023  润新知