有人可以解释一下为什么在以下情况下EF引擎会失败吗?
使用以下表达式时,它可以正常工作:
生成的查询语句:
使用以下表达式时,它可以正常工作:
var data = context.Programs
.Select(d => new MyDataDto
{
ProgramId = d.ProgramId,
ProgramName = d.ProgramName,
ClientId = d.ClientId,
Protocols = d.Protocols.Where(p => p.UserProtocols.Any(u => u.UserId == userId))
.Count(pr => pr.Programs.Any(pg => pg.ProgramId == d.ProgramId))
})
.ToList();
但是如果我将一些内容封装到扩展方法中:
public static IQueryable<Protocol> ForUser(this IQueryable<Protocol> protocols, int userId)
{
return protocols.Where(p => p.UserProtocols.Any(u => u.UserId == userId));
}
生成的查询语句:
var data = context.Programs
.Select(d => new MyDataDto
{
ProgramId = d.ProgramId,
ProgramName = d.ProgramName,
ClientId = d.ClientId,
Protocols = d.Protocols.ForUser(userId)
.Count(pr => pr.Programs.Any(pg => pg.ProgramId == d.ProgramId))
})
.ToList();
出现异常:LINQ to Entities不识别方法'System.Linq.IQueryable1[DAL.Protocol] ForUser(System.Linq.IQueryable1[DAL.Protocol], Int32)',且该方法无法转换为存储表达式。
我希望EF引擎能够构建整个表达树,链接必要的表达式,然后生成SQL。为什么它不能这样做呢?
d.Protocols
似乎是一个导航属性,因此不能是IQueryable<Protocol>
(很可能是ICollection<Protocol>
),对吗? - Ivan Stoev