使用Linq查找缺少相关数据的记录

使用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 这是一种典型的一对多客户/订单关系。给定这些数据,只

我尝试使用Linq to实体来查找不存在订单的类别

 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有一个订单,我只想要那些不存在订单的类别,而不考虑客户。希望这是有道理的。