1

我正在使用 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 表的 ID 字段的外键。但是当我尝试编写 Include 语句以在结果集中包含 AssetType 时,它​​不起作用,并且每个 Asset 实体的 AssetType 属性始终为空......但是,如果我不使用 .AsExpandable ,同样的事情也可以正常工作() 延期。

关于我们如何使用 AsExpandable() 扩展结果集来加载相关实体的任何想法。

PS - 我的场景比我提供的示例代码有点复杂,所以我不能避免使用这个扩展。

4

2 回答 2

0

显然,AsExpandable 扩展方法返回不同的返回类型是一个已知问题,因此破坏了实体框架的包含位。有一个解决方法:预测。如果您定义一个 Select 语句来导航到您的导航属性,您应该能够将它们包含在您的结果集中。

于 2015-09-22T09:20:06.490 回答
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>();
于 2015-10-26T06:08:30.893 回答