2013-10-27 32 views
0

我試圖寫在C#中的LINQ查詢將返回誰收到他們所訂購的物品,但不能算出它的客戶名單三特里爾Linq查詢

我的數據庫架構是這樣的:
表名稱:客戶,主要的領域:客戶編號
表名稱:訂單,主要字段:訂單,外鍵:客戶編號
表名:OrderLineItems,主要領域:LineItemId,外鍵:訂單

行項目表也有一個名爲'狀態'的字段,我指出這個項目是否有已訂購','重新訂購','已發貨'等。

我在尋找的是至少有一個訂單的顧客列表(我對沒有訂購任何東西的顧客不感興趣) ,我只對至少有一件物品的訂單感興趣(以防某人在沒有任何物品的情況下創建了空訂單),最後我的最後一個標準是所有物品都必須具有給定的狀態(例如:「發貨」)。

如果我寫的SQL查詢時,它會是這個樣子:

SELECT c.* 
    FROM Customers c 
     INNER JOIN Orders o ON c.CustomerId = o.CustomerId 
     INNER JOIN (SELECT oli.OrderId, COUNT(*) AS [NumberOfItems] FROM OrderLineItems oli WHERE oli.Status <> 'Shipped' GROUP BY oli.OrderId) items ON o.OrderId = items.OrderId 
WHERE items.NumberOfItems = 0 

(隨意提出一個更好的SQL查詢,順便說一下,如果你能想到更好的辦法來讓我在尋找)

理想的數據,我會得到C#代碼這有點兒像這樣:

var customers = from c in context.Customers 
    where ... 
    select c; 

回答

6
customers.Where(c => c.Orders.Any(o => 
    o.OrderLineItems.Any() 
    && o.OrderLineItems.All(i => i.Status == requestedStatus))) 

Orders.Any()標準適用於您的要求「至少有一個訂單的客戶」; OrderLineItems.Any()標準爲「我只對至少有一件物品的訂單感興趣」,並且「所有物品都必須具有給定狀態」的標準爲OrderLineItems.All()