2017-07-17 51 views
1

下面是一個查詢:獲取項目的列表,其ID等於某一值 - LINQ C#

from order in db.tblCustomerBuys 
where selectedProducts.Contains(order.ProductID) 
select order.CustomerID; 

selectedProducts是包含一些目標產品ID的列表,例如它是{ 1, 2, 3}。 以上查詢將返回他們已購買selectedProducts之一的客戶ID。例如,如果某人購買了產品1或2,則其ID將被結果。

但我需要收集他們已經購買了所有產品的客戶ID。例如,如果有人購買了產品1 AND 2 AND 3,那麼它將會是結果。

如何編輯此查詢?

的tblCustomerBuys是這樣的:

CustomerID - ID of Customer 
ProductID - the product which the customer has bought 

是這樣的:

CustomerID  ProdcutID 
--------------------------- 
110    1 
110    2 
112    3 
112    3 
115    5 

更新時間:

由於答案我應該做的分組,由於某種原因,我應該使用這種類型的查詢:

var ID = from order in db.tblCustomerBuys 
     group order by order.CustomerID into g 
     where (selectedProducts.All(selProdID => g.Select(order => order.ProductID).Contains(selProdID))) 
     select g.Key; 

但它會給出這個錯誤: Local sequence cannot be used in LINQ to SQL implementations of query operators except the Contains operator.

+2

我認爲你需要也添加數據庫的結構。訂單和產品如何連接? –

+0

如何在一個'tblCustomerBuys'條目中購買多個產品?到目前爲止,我只看到一個字段'ProductID',我認爲這個字段只有一個值。或者我錯了 –

+1

@MongZhu:這是客戶和(購買)產品之間的關係表。所以重複'CustomerID'意味着這個客戶已經購買了多個產品。 –

回答

3

更新的查詢是問題的常規LINQ解決方案。

但由於您的查詢提供者不支持與數據庫表中存儲序列混合(其轉換爲SQL IN (value_list)Contains除外)的查詢中,你需要All方法的另一種等價的方法,這可能是數(不同的)匹配並與選擇的項目數進行比較。

如果{ CustomerID, ProductID }組合在tblCustomerBuys獨特,那麼查詢可能如下:

var selectedCount = selectedProducts.Distinct().Count(); 
var customerIDs = 
    from order in db.tblCustomerBuys 
    group order by order.CustomerID into customerOrders  
    where customerOrders.Where(order => selectedProducts.Contains(order.ProductID)) 
     .Count() == selectedCount 
    select customerOrders.Key; 

如果它不是唯一的,請使用下列標準:

where customerOrders.Where(order => selectedProducts.Contains(order.ProductID)) 
    .Select(order => order.ProductID).Distinct().Count() == selectedCount 
+1

漂亮的代碼,它的作品,但我編輯了一下!你的代碼有一個小問題:改變'selectedProducts.Contains(order => order.ProductID)'到'selectedProducts.Contains(order.ProductID)',就是這樣;) – Nofuzy

+0

典型的SO編輯器輸入錯誤,抱歉:) –

1

您可以使用任何條件的Linq。
步驟1:創建爲int的列表,所有需要的產品ID存儲
第2步:使用LINQ的任何條件從該列表比較

List<int> selectedProducts = new List<int>() { 1,2 } // This list will contain required product ID 

db.tblCustomerBuys.where(o=> selectedProducts .Any(p => p == o.ProductID)).select (o=>o.order.CustomerID); // This will return all customerid who bought productID 1 or 2 
+0

謝謝,但我需要返回所有customerid誰買了productID 1'AND' 2 – Nofuzy

3

至於你的問題被寫,實在是有點很難理解你的結構。如果我理解正確,你有一個枚舉selectedProducts,其中包含幾個ID。您還可以枚舉order對象,它們有兩個我們關心的屬性,ProductIdCustomerId,它們是整數。

在這種情況下,本應做的工作:

ver result = db.tblCustomerBuys.GroupBy(order => order.CustomerId) 
           .Where(group => !selectedProducts.Except(group).Any()) 
           .Select(group => group.Key); 

我們正在做的事情是,我們把所有的客戶一起通過他們的CustomerId,這樣我們就可以把每一個客戶作爲一個單一的價值。然後,我們將group作爲selectedProducts的超集,並使用常用於檢查一個枚舉是否是另一個枚舉子集的linq技巧。我們基於此篩選db.tblCustomerBuys,然後選擇每個匹配訂單的CustomerId

相關問題