我有一个包含以下表格的数据库模型:
A * ---- 1 B 1 ---- * C
基于这个模式,我创建了一个实体数据模型,它允许我在我的数据库中加载所有As。因为我也在我的Linq查询中使用Bs,所以加载As就像这样:
using(MyEntities entities = new MyEntities()){
var result = from a in entities.As.Include("B") where a.Code == 123 && a.B.Code == 321 select a;
}
结果可以由用户进一步过滤,因此我根据用户的选择构建过滤器,如下所示:
int filterValue = 222; //FilterValue is passed in by the user
IList<Func<A, bool>> filters = new List<Func<A, bool>>();
filters.Add(x => x.B.C.Any(i => i.C.Code == filterValue));
...build more filters...
稍后我使用以下方法应用过滤器:
foreach (var filter in filters)
{
results = results.Where(filter);
}
请注意,在过滤器代码中我使用C引用(它是Cs的集合)。由于C集合为空(未加载),因此EF失败的地方。如何强制EF急切加载对象图的所有相关属性,以便我可以应用我的过滤器,或者有更好的方法吗?
感谢。
答案 0 :(得分:0)
您使用IList<Func<A, bool>>
作为过滤条件。这使它成为LINQ-to-Objects查询。这就是为什么你抱怨C
收集是空的。
因此,请使用IList<Expression<Func<A, bool>>>
作为过滤器。
答案 1 :(得分:0)
未加载C的原因是您未将其包含在查询中。你必须使用:
entities.As.Include("B.C")
但结果如@Eranga所述 - 您正在将所有记录传输到您的应用程序,并通过linq-to-objects在应用程序内存中过滤它们,而不是通过linq-to-entities进行过滤并仅传输过滤后的记录。