在LINQ查询中使用Contains()时出现异常

时间:2012-04-27 23:22:11

标签: c# linq entity-framework

我在尝试让以下工作时遇到问题。我尝试了两种不同的方式,都编译但在运行时都抛出异常。

解决方案A抛出

  

NotSupportedException“LINQ to Entities无法识别方法'MyDB.MemberClass GetMemberClass(MyDB.Member,System.DateTime)'方法,并且此方法无法转换为商店表达式。”

解决方案B抛出

  

NotSupportedException“LINQ to Entities不支持LINQ表达式节点类型'Invoke'。”

这是我的代码:

    public delegate string GetClassShortName(Member m, DateTime d);

    private void UserControl_Initialized(object sender, EventArgs e)
    {
        //Solution A
        var members = from m in dbContext.Members
                      where new[] { "A", "P", "S", "J" }.Contains(MemberHelper.GetMemberClass(m, DateTime.Now).ShortName)
                      orderby m.Line
                      select m;

        //Solution B
        GetClassShortName gcsn = (n,d) => (MemberHelper.GetMemberClass(n, d).ShortName);
        var members = dbContext.Members.Where(m => new[] { "A", "P", "S", "J" }.Contains(gcsn(m, DateTime.Now)));

        foreach (Member m in members)
        {
            ...

我正在努力让那些拥有“类”的成员在一组值中。 (A,P,S,J)。成员的班级取决于您希望它的日期,因为它随着时间的推移而变化。因此,类存储在不同的表中,我使用MemberHelper.GetMemberClass函数来获取指定日期的类。 (在这种情况下,现在)


新解决方案

我放弃了尝试使用LINQ完成所有工作并更改了我的代码,如下所示。可能有一种更优雅的方式来做到这一点,但它确实有效。

        var data = from mj in this.dbContext.MemberJournals
                      where mj.Effective <= date
                      orderby mj.Member.Line, mj.Effective
                      select mj;

        foreach (MemberJournal mj in data)
        {
            if (mj.ClassID == MemberHelper.GetMemberClass(mj.Member, date).ID)
            {
                if (new[] { "A", "P", "J", "S" }.Contains(mj.MemberClass.ShortName.Trim()))
                {
                    //Perform my Task
                    ...
                }
            }
        }

1 个答案:

答案 0 :(得分:3)

您无法在要转换为SQL的代码中调用任意C#方法。可以转换为SQL的代码是其他有效C#的非常有限子集。