使用Linq查找缺少相关数据的记录
我尝试使用Linq to实体来查找不存在订单的类别使用Linq查找缺少相关数据的记录,linq,entity-framework,Linq,Entity Framework,我尝试使用Linq to实体来查找不存在订单的类别 TABLE Customer TABLE Order ------------------ ---------------- CustId Category OrderId FKCustId 1 2 1 1 2 2 3 3 这是一种典型的一对多客户/订单关系。给定这些数据,只
TABLE Customer TABLE Order
------------------ ----------------
CustId Category OrderId FKCustId
1 2 1 1
2 2
3 3
这是一种典型的一对多客户/订单关系。给定这些数据,只有类别3没有与之关联的订单,因此我想生成一个结果集,其中类别3是唯一的项。这一定是一个很简单的查询,但我还没有弄明白。我试过很多不同的角度;下面是一个不起作用的:
var dtos = ctx.Customers
.GroupBy(c => c.Category)
.Where(c => !c.Any(c2 => !c2.Orders.Any()))
.Select(c => c.Key);
当我尝试这个方法时,它返回了一个有订单的类别,而没有返回缺少订单的类别
提前感谢您的帮助!
罗杰您首先需要获得没有任何订单的客户,然后再获得类别。有点像先做where,然后再把类别拿出来。你的查询很接近,但是
!任何
后跟!任何
都会偏离你的逻辑。您希望选择所有客户都没有订单的类别。但您的查询会选择没有客户没有订单的所有类别。我希望这是有道理的
尝试更改您的第一个!任何
到所有:
var dtos = ctx.Customers
.GroupBy(c => c.Category)
.Where(c => c.All(c2 => !c2.Orders.Any()))
.Select(c => c.Key);
或在查询语法中:
var dtos =
from c in Customers
group c by c.Category into g
where g.All(c => !c.Orders.Any())
select g.Key;
var dtos =
from c in Customers
group c by c.Category into g
where !g.Any(c => c.Orders.Any())
select g.Key;
或者更改第二个
!任意
到任意
var dtos = ctx.Customers
.GroupBy(c => c.Category)
.Where(c => !c.Any(c2 => c2.Orders.Any()))
.Select(c => c.Key);
或在查询语法中:
var dtos =
from c in Customers
group c by c.Category into g
where g.All(c => !c.Orders.Any())
select g.Key;
var dtos =
from c in Customers
group c by c.Category into g
where !g.Any(c => c.Orders.Any())
select g.Key;
改变!任何人都能让事情顺利进行。真不敢相信我离得这么近——谢谢你让我走完剩下的路。我很感激你的建议,但我认为这行不通。在没有订单的情况下获得客户将返回属于类别2的客户ID#2,但我们不希望在结果集中包含此类别。@user591281-我很困惑。查看您提供的示例数据,cat2在resultset中也有效,因为它没有任何订单,对吗?cat2无效,因为属于cat2的cust 1有一个订单,我只想要那些不存在订单的类别,而不考虑客户。希望这是有道理的。