C# EF核心过滤&x2B;使用子实体分页
我想使用efcore执行1个查询,其中我必须对子实体进行筛选,并应用分页。请参见下面的我的(示例)数据模型: 我想检索所有数据(客户、订单详细信息和产品)。我必须对Order.OrderState应用筛选器,我只需要前10条记录(客户) 这是我尝试的LINQ查询:C# EF核心过滤&x2B;使用子实体分页,c#,.net,entity-framework,linq,.net-core,C#,.net,Entity Framework,Linq,.net Core,我想使用efcore执行1个查询,其中我必须对子实体进行筛选,并应用分页。请参见下面的我的(示例)数据模型: 我想检索所有数据(客户、订单详细信息和产品)。我必须对Order.OrderState应用筛选器,我只需要前10条记录(客户) 这是我尝试的LINQ查询: var customers = await _ctx.Customer .Include(c => c.Order.Where(o => o.OrderState == 0))
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:属性表达式“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();
谢谢你,穆罕默德。Distinct将应用于整行,因此Customer、Order等应该只对Customer进行Distinct,以获得我想要的结果,但事实并非如此。