使用LinqKit PredicateBuilder时,Entity Framework 4.1 Code First-

本文关键字:Code First- Framework Entity LinqKit PredicateBuilder 使用 | 更新日期: 2023-09-27 17:59:44

我使用的是Entity Framework 4.1 Code First,还使用了PredicateBuilder,这样我就可以跨多个规范类构建谓词表达式(使用规范模式)。我能够正确地构建一个谓词并将其应用于DbSet,我得到的数据就是我所期望的。然而,无论我尝试什么,它总是懒惰加载。这是我如何构建谓词并应用它的一个简单示例

IQueryable<HairColor> hairColorQuery = Context.Set<HairColor>().AsExpandable();
Expression<Func<Parent, bool>> parentPredicate = PredicateBuilder.And(PredicateBuilder.True<Parent>(), p => p.NameLast.StartsWith("V")).Expand();
Expression<Func<HairColor, bool>> hairColorPredicate = PredicateBuilder.And(PredicateBuilder.True<HairColor>(), h => h.Parents.AsQueryable().Any(parentPredicate));
HairColor[] hairColors = hairColorQuery.Where(hairColorPredicate).Include(h => h.Parents).ToArray();

就像我上面说的,我正在取回我想要的数据,但它忽略了Include。

有人有什么想法吗?

使用LinqKit PredicateBuilder时,Entity Framework 4.1 Code First-

Hi稍后加入,但在使用LinqKit谓词生成器时使用扩展Include方法也有同样的问题。上一个答案中提到的问题是,将LinqKits ExpandableQuery强制转换为ObjectQuery(根据Include扩展的要求)会导致null。

但是找到了此链接http://petemontgomery.wordpress.com/2011/02/10/a-universal-predicatebuilder/这是一个谓词生成器,它不使用AsExpandable来执行搜索,因此可以在它上使用Include方法。虽然上面的解决方案也对我有效,但这个不同的谓词生成器允许我保持代码更干净/更一致的

它可能正在更改查询形状。尝试此解决方法

HairColor[] hairColors = hairColorQuery.Where(hairColorPredicate)
                                       .Select(hc => new 
                                                     {
                                                         HairColor = hc,
                                                         Parents = hc.Parents // eager load
                                                     })
                                       .AsEnumerable()
                                       .Select(hc => hc.HairColor);