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

时间:2015-09-02 10:02:41

标签: .net linq entity-framework entity-framework-5 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表的ID字段的外键。 但是当我尝试编写Include语句以在结果集中包含AssetType时,它不起作用,并且每个Asset实体的AssetType属性始终为null ... 但是,如果我不使用.AsExpandable()扩展名,那么同样的工作正常。

了解我们如何使用结果集的AsExpandable()扩展来加载相关实体。

P.S。 - 我的方案比我提供的示例代码有点复杂,所以我无法避免使用此扩展程序。

2 个答案:

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