LINQ to Entities无法识别嵌套选择中的方法'System.Linq.IQueryable

时间:2015-04-15 09:06:59

标签: 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)));
}

当我使用此方法时使用&#34;正常&#34;选择,一切都很好:

context.tblAbwesenheits.OnlyApprovedAbsences().ToList()

但是当我在Select语句中使用它时,我收到一个错误:

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

LINQ to Entities无法识别该方法   &#39; {System.Linq.IQueryable {1}} 1 [Data.tblAbwesenheit])&#39;   方法,并且此方法无法转换为商店表达式。

我已经搜索了很多,但找不到一种方法来教授实体框架来识别我的方法而不将查询扩展到

1[Data.tblAbwesenheit]
  OnlyApprovedAbsences(System.Linq.IQueryable

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

1 个答案:

答案 0 :(得分:2)

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)