gpt4 book ai didi

c# - EF Core 过滤 + 子实体分页

转载 作者:行者123 更新时间:2023-11-30 18:16:27 25 4
gpt4 key购买 nike

我想使用 EF Core 执行 1 个查询,我必须在其中过滤子实体并应用分页。请参阅下面我的(示例)数据模型: Data Model我想检索所有数据(客户、订单、订单详细信息和产品)。我必须在 Order.OrderState 上应用过滤器,我只想要前 10 条记录(客户)

这是我试过的 LINQ 查询:

var customers = await _ctx.Customer
.Include(c => c.Order.Where(o => o.OrderState == 0))
.ThenInclude(o => o.OrderDetail)
.ThenInclude(d => d.Product)
.Skip(0).Take(10)
.ToListAsync();

执行此查询时出现以下错误:InvalidOperationException: The property expression 'c => {from Order o in c.Order where ([o].OrderState == 0) select [o]}'无效。该表达式应表示属性访问:'t => t.MyProperty'。有关包含相关数据的更多信息

所以我尝试了另一个查询:

var qry = from c in _ctx.Customer
join o in _ctx.Order on c.Id equals o.CustomerId
join d in _ctx.OrderDetail on o.Id equals d.OrderId
join p in _ctx.Product on d.ProductId equals p.Id
where o.OrderState == 0
select new { Customer = c, Order = o, OrderDetail = d, Product = p };
var customers = await qry.Skip(0).Take(10).ToListAsync();

现在查询没有产生错误,但结果不是我想要的。由于 1-n 关系,此查询在结果中多次返回客户,所以我没有得到前 10 个客户。

有没有人有更好的查询来获得我想要的结果?

最佳答案

我认为您可以在构建查询时使用“.Distinct()”。希望这能解决问题。

    var qry = (from c in _ctx.Customer
join o in _ctx.Order on c.Id equals o.CustomerId
join d in _ctx.OrderDetail on o.Id equals d.OrderId
join p in _ctx.Product on d.ProductId equals p.Id
where o.OrderState == 0
select new { Customer = c, Order = o, OrderDetail = d,
Product = p }).Distinct();

var customers = await qry.Skip(0).Take(10).ToListAsync();

关于c# - EF Core 过滤 + 子实体分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46521648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com