首页 > 解决方案 > Entity Framework Core 6(预览版)迫使我使用 .AsEnumerable()

问题描述

我已经在我的项目中从 .net5 更新到 .net6 预览版,但我遇到了 Entity Framework Core 的问题。

这些查询在 EF Core 5 中运行良好,但是,它们迫使我.AsEnumerable()在 EF Core 6 中工作,它使用的内存是以前使用的两倍。看起来应该可以做到(特别是因为它在 EF Core 5 中运行良好),也许我应该配置一些不同的东西来进行这些查询?

var _data1 = _dbContext.Dataset1
                       .Where(f => f.PostedDate >= DateSince && f.PostedDate <= DateUntil)
                       .AsEnumerable();

var _orders = _dbContext.Orders
                        .Where(o => _data1.Select(f => f.OrderID).Contains(o.OrderID))
                        .AsEnumerable();

var _itms = _dbContext.Items
                      .Where(i => _orders.Select(o => o.OrderID).Contains(i.OrderId))
                      .AsEnumerable();

foreach(var order in _orders )
{
    var itms  = _itms?.Where(i => i.OrderId == order.OrderID);
    //...
}

更新: 这是在没有 .AsEnumerable() 的情况下引发的异常

LINQ 表达式 'DbSet() .Where(o => DbSet() .Where(f => f.PostedDate >= __DateSince_0 && f.PostedDate <= __DateUntil_1) .Select(f => f.OrderID) .Contains(o .OrderID))' 无法翻译。
以可翻译的形式重写查询,或通过插入对“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的调用显式切换到客户端评估。有关详细信息,请参阅 https://go.microsoft.com/fwlink/?linkid=2101038

标签: c#linq.net-6.0ef-core-6.0

解决方案


您应该能够通过使用导航属性并将结果分组在一起来解决此问题,这样您最终只会得到一个 LINQ 查询。

var _groupedItems = _dbContext.Items
                              .Includes(i => i.Order)
                              .ThenIncludes(o => o.Dataset1)
                              .Where(f => f.Order.Dataset1.PostedDate >= DateSince && f.Order.Dataset1.PostedDate <= DateUntil)
                              .GroupBy(i => i.Order)
                              .Select(g => new
                              {
                                  Order = g.Key,
                                  Items = g.ToList()
                              });

foreach(var itemGroup in _groupedItems)
{
    var itms  = itemGroup.Items;
    //...
}

推荐阅读