获取其ID等于某些值的项目列表 - linq c#

时间:2017-07-17 07:35:29

标签: c# linq

这是一个查询:

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

selectedProducts是包含一些目标产品ID的列表,例如{ 1, 2, 3}。 上面的查询将返回他们购买selectedProducts之一的customerID。例如,如果有人购买了产品1或2,则其ID将在结果中。

但我需要在他们购买所有产品的地方收集客户ID。例如,如果有人购买了产品1和2和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.

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

更新后的查询是该问题的一般LINQ解决方案。

但是,由于您的查询提供程序不支持将内存序列与查询中的数据库表混合(Contains除了转换为SQL IN (value_list)之外),因此您需要一种替代的等效方法{ {1}}方法,可以计算(不同的)匹配并与所选项目进行比较。

如果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;

答案 2 :(得分:1)

您可以使用Linq的任何条件。
步骤1:创建存储所有必需产品ID的int列表
步骤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