c# - LINQ to Entities 无法识别嵌套选择中的“System.Linq.IQueryable”方法

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

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

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 does not recognize the method 'System.Linq.IQueryable1[Data.tblAbwesenheit] OnlyApprovedAbsences(System.Linq.IQueryable1[Data.tblAbwesenheit])' method, and this method cannot be translated into a store expression.

我已经搜索了很多,但找不到一种方法来教 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 识别我的方法?

最佳答案

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)

关于c# - LINQ to Entities 无法识别嵌套选择中的“System.Linq.IQueryable”方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29646075/

相关文章:

c# - 初始化服务类中的 FileStream 和 StreamWriter 字段

c# - 不可变字典尝试添加

c# - 加入时在 linq 中排序

c# - 使用 linq 从字符串中提取对象列表

c# - 在 C# 中对嵌套字符串列表进行排序

c# - Datetime.ToString() C# 未按预期工作

c# - LINQ:唯一名称列表

c# - 导航属性已配置有冲突的多重性 Fluent API

c# - 类型未映射 Entity Framework 5.0

visual-studio-2010 - 在 Visual Studio 2010 表设计器中使用枚举