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

时间:2013-03-30 00:47:04

标签: linq entity-framework

我正在尝试使用Linq to Entities来查找没有订单的类别。

 TABLE Customer              TABLE Order
------------------         ----------------
CustId   Category          OrderId FKCustId
  1         2                 1       1
  2         2
  3         3

这是一个典型的1对多客户/订单关系。鉴于此数据,只有类别3没有与之关联的订单,因此我想生成一个结果集,其中类别3是唯一的项目。这必须是一个简单的查询,但我无法弄清楚。我尝试了很多不同的角度;这是一个不起作用的:

var dtos = ctx.Customers
       .GroupBy(c => c.Category)
       .Where(c => !c.Any(c2 => !c2.Orders.Any()))
       .Select(c => c.Key);

当我尝试这个时,它返回了一个 订单的类别,而没有返回缺少订单的类别。

提前感谢您的帮助! 罗杰

2 个答案:

答案 0 :(得分:1)

您的查询已接近,但!Any后跟!Any会丢失您的逻辑。您想要选择所有客户都没有订单的类别。但是您的查询会选择所有没有客户没有订单的类别。 我希望有道理

尝试将您的第一个!Any更改为All

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;

或者将第二个!Any更改为Any

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.Any(c => c.Orders.Any())
    select g.Key;

答案 1 :(得分:0)

您首先需要获得没有任何订单的客户,然后获取类别。排序先做你的位置然后分类