我正在使用LinqKIT的.AsExpandable()扩展来动态生成Where表达式。
例如,
Expression<Func<Asset, bool>> assetNamePredicate = m => m.AssetName == "abc";
Expression<Func<Asset, bool>> assetPurchaseDateFromPredicate = m => m.PurchaseDate > DateTime.Now.AddDays(-10);
Expression<Func<Asset, bool>> whereExpression = t => assetNamePredicate.Invoke(t) && assetPurchaseDateFromPredicate.Invoke(t);
return new entitiesContainer().Set<Asset>().AsExpandable().Where(whereExpression).ToList<Asset>();
现在,Asset实体包含AssetTypeID,它具有AssetType表的ID字段的外键。 但是当我尝试编写Include语句以在结果集中包含AssetType时,它不起作用,并且每个Asset实体的AssetType属性始终为null ... 但是,如果我不使用.AsExpandable()扩展名,那么同样的工作正常。
了解我们如何使用结果集的AsExpandable()扩展来加载相关实体。
P.S。 - 我的方案比我提供的示例代码有点复杂,所以我无法避免使用此扩展程序。
答案 0 :(得分:0)
显然,AsExpandable扩展方法返回不同的返回类型是一个已知问题,因此打破了实体框架的包含位。有一个解决方法:预测。如果您定义一个导航到导航属性的Select语句,则应该能够将它们包含在结果集中。
答案 1 :(得分:0)
我找到了解决这个问题的方法 - 基本上,这需要创建一个“包含”表达式数组,并对它们进行查询 -
例如,
List<Expression<Func<Asset, object>>> includes = new List<Expression<Func<Asset, object>>>();
includes.Add(m => m.City);
includes.Add(m => m.City.Country);
return includes
.Aggregate(query.AsQueryable(), (current, include) => current.Include(include))
.AsExpandable()
.Where(whereExpression)
.ToList<Address>();