如何在使用 LinqKIT 的 .AsExpandable() 时包含子实体(导航)

How to include child entities (navigation) while using .AsExpandable() of LinqKIT

我正在使用 LinqKIT 的 .AsExpandable() 扩展来动态生成 W​​here 表达式。

例如,

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>();