如何在使用 LinqKIT 的 .AsExpandable() 时包含子实体(导航)
How to include child entities (navigation) while using .AsExpandable() of LinqKIT
我正在使用 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 table 的 ID 字段的外键。
但是当我尝试编写 Include 语句以在结果集中包含 AssetType 时,它不起作用,并且每个资产实体的 AssetType 属性 始终为 null ...
但是,如果我不使用 .AsExpandable() 扩展名,则同样可以正常工作。
关于如何使用结果集的 AsExpandable() 扩展来加载相关实体的任何想法。
P.S。 - 我的场景比我提供的示例代码有点复杂,所以我无法避免使用这个扩展..
显然,AsExpandable 扩展方法 return 是一种不同的 return 类型,因此破坏了 Entity Framework 的包含位,这是一个已知问题。有一个解决方法:投影。如果您定义一个 Select 语句来导航到您的导航属性,您应该能够将它们包含在您的结果集中。
我找到了这个问题的解决方案 -
基本上,这需要创建一个 "Include" 表达式数组,并针对它们进行查询 -
例如,
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>();
我正在使用 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 table 的 ID 字段的外键。 但是当我尝试编写 Include 语句以在结果集中包含 AssetType 时,它不起作用,并且每个资产实体的 AssetType 属性 始终为 null ... 但是,如果我不使用 .AsExpandable() 扩展名,则同样可以正常工作。
关于如何使用结果集的 AsExpandable() 扩展来加载相关实体的任何想法。
P.S。 - 我的场景比我提供的示例代码有点复杂,所以我无法避免使用这个扩展..
显然,AsExpandable 扩展方法 return 是一种不同的 return 类型,因此破坏了 Entity Framework 的包含位,这是一个已知问题。有一个解决方法:投影。如果您定义一个 Select 语句来导航到您的导航属性,您应该能够将它们包含在您的结果集中。
我找到了这个问题的解决方案 - 基本上,这需要创建一个 "Include" 表达式数组,并针对它们进行查询 -
例如,
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>();