2013-03-30 30 views
2

我正在尝试使用Linq to Entities来查找没有订单的类别。使用Linq查找缺少相关数据的记录

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); 

当我尝试这样做,它返回一个大类,确实有订单,而不是返回类别丢失订单。

在此先感谢您的帮助! Roger

回答

1

您的查询已结束,但!Any后跟!Any正在抛弃您的逻辑。您想要选择所有客户没有订单的类别。但是,您的查询会选择没有客户没有订单的所有类别。 我希望是有道理的

试着改变你的第一!AnyAll

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; 

或者改变第二!AnyAny

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; 
+0

更改!任何东西都可以正常工作。不能相信我如此亲密 - 感谢让我在那里休息。 – Roger

0

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

+0

我感谢您的建议,但我不认为这会工作。在没有订单的情况下获取客户会返回属于第2类的客户ID号2,但我们不希望在结果集中包含此类别。 – Roger

+0

@ user591281 - 我很困惑。看看你提供的样本数据,cat2在resultset中也是有效的,因为它没有任何正确的命令? – Brian

+0

Cat 2无效,因为属于Cat 2的Cust 1有订单,而且我只想要那些没有订单的类别,不管客户。希望这是有道理的。 – Roger