2013-03-30 31 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