我有表请求,有批准:
public class Request {
public virtual List<Approval> Approvals { get; set; }
}
请求来自DB
public DbSet<Request> Request { get; set; }
我有扩展方法:
public static IQueryable<Request> HaveApprovals(this IQueryable<Request> requests) {
return requests.Where(r => r.ActiveApprovals().Count() > 0).ToList();
}
另一种扩展方法:
public static IEnumerable<Approval> ActiveApprovals(this Request request) {
return request.Approvals.Where(a => !a.Deleted);
}
但是得到错误:
LINQ to Entities does not recognize the method 'System.Collections.Generic.IEnumerable`1[Domain.Approval] ActiveApprovals(Domain.Request)' method, and this method cannot be translated into a store expression.
由于某种原因,一个扩展方法可以转换为LINQ,但是当在另一个扩展方法中使用扩展方法时,它无法转换。有什么建议吗?
答案 0 :(得分:0)
尝试以这种方式重写HaveApprovals扩展程序:
public static IQueryable<Request> HaveApprovals(this IQueryable<Request> requests) {
return requests.Where(r => r.Approvals.Any(a => !a.Deleted)).ToList();
}
发生错误,因为EF尝试在服务器端(SQL服务器)执行查询中的任何操作。所以SQL对你的扩展方法以及如何执行它一无所知。
更新#1:
在下面查询
var query = this.DataContext.Products.Where(x => x.Sales.Any(s => s.SectorId == 1));
将生成以下SQL查询
SELECT [t0].[Id], [t0].[Name], [t0].[Description]
FROM [dbo].[Products] AS [t0]
WHERE EXISTS(
SELECT NULL AS [EMPTY]
FROM [dbo].[Sales] AS [t1]
WHERE ([t1].[SectorId] = @p0) AND ([t1].[ProductId] = [t0].[Id])
)
}
它不会提取所有记录,因此不会降低性能。
答案 1 :(得分:0)
返回Iqueryable或Ienumerable而不是列表。该查询将由sql处理,因此无法理解返回的列表