1

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

解决方案 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
                    ...
                }
            }
        }
4

1 回答 1

3

您不能在旨在转换为 SQL 的代码中调用任意 C# 方法。可以翻译成 SQL 的代码是其他有效 C# 的一个非常有限的子集。

于 2012-04-27T23:27:24.083 回答