【问题标题】:LINQ to Entities does not recognize the method 'System.Linq.IQueryable in nested selectLINQ to Entities 无法识别嵌套选择中的方法“System.Linq.IQueryable”
【发布时间】:2026-02-14 03:40:01
【问题描述】:

我写了一个扩展方法来从缺勤列表中只获得批准的缺勤:

public static IQueryable<tblAbwesenheit> OnlyApprovedAbsences(this IQueryable<tblAbwesenheit> source)
{
    return source.Where(a =>
        (a.tblAbwesenheitsantraggenehmigungs.Any() && a.tblAbwesenheitsantraggenehmigungs.All(g => g.AbwesenheitsgenehmigungsstatusID == AbsenceStatusIds.Approved))
        && (!a.tblAbwesenheitsstornierunggenehmigungs.Any() || a.tblAbwesenheitsstornierunggenehmigungs.Any(g => g.AbwesenheitsgenehmigungsstatusID != AbsenceStatusIds.Approved)));
}

当我将此方法与“正常”选择一起使用时,一切都很好:

context.tblAbwesenheits.OnlyApprovedAbsences().ToList()

但是,当我在 Select 语句中使用它时,出现错误:

context.tblMitarbeiters.Select(m => new
{
    Employee = m,
    AbsencesForEmployee = m.tblAbwesenheits.OnlyApprovedAbsences()
})
.ToList();

LINQ to Entities 无法识别该方法 'System.Linq.IQueryable1[Data.tblAbwesenheit] OnlyApprovedAbsences(System.Linq.IQueryable1[Data.tblAbwesenheit])' 方法,并且该方法不能翻译成商店表达式。

我已经搜索了很多,但找不到一种方法来教 Entity Framework 在不扩展查询的情况下识别我的方法

context.tblMitarbeiters.Select(m => new
{
    Employee = m,
    AbsencesForEmployee = m.tblAbwesenheits
        .Where(a =>
            (a.tblAbwesenheitsantraggenehmigungs.Any() && a.tblAbwesenheitsantraggenehmigungs.All(g => g.AbwesenheitsgenehmigungsstatusID == AbsenceStatusIds.Approved))
            && (!a.tblAbwesenheitsstornierunggenehmigungs.Any() || a.tblAbwesenheitsstornierunggenehmigungs.Any(g => g.AbwesenheitsgenehmigungsstatusID != AbsenceStatusIds.Approved)))
})
.ToList();

有没有办法让 EF 识别我的方法?

【问题讨论】:

    标签: c# linq entity-framework extension-methods iqueryable


    【解决方案1】:

    EF 正在尝试寻找与您的方法等效的 SQL,但没有找到。它可以找到扩展查询的等效项,这就是它起作用的原因。

    你也许可以创建一个表达式而不是一个方法

    var OnlyApprovedAbsencesExpression = (a =>
                (a.tblAbwesenheitsantraggenehmigungs.Any() && a.tblAbwesenheitsantraggenehmigungs.All(g => g.AbwesenheitsgenehmigungsstatusID == AbsenceStatusIds.Approved))
                && (!a.tblAbwesenheitsstornierunggenehmigungs.Any() || a.tblAbwesenheitsstornierunggenehmigungs.Any(g => g.AbwesenheitsgenehmigungsstatusID != AbsenceStatusIds.Approved)))
    

    然后写类似

    AbsencesForEmployee = m.tblAbwesenheits.Where(OnlyApprovedAbsencesExpression)
    

    【讨论】:

    • 这给了我一个编译器错误:无法将 lambda 表达式分配给隐式类型的局部变量
    • 如果你明确地将 var 输入为Expression&lt;Func&lt;tblAbwesenheit, bool&gt;&gt;,它就可以工作。但是我仍在寻找没有 Where 的解决方案
    最近更新 更多