这是一个查询:
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.
答案 0 :(得分:3)
正如您的问题所写,理解您的结构有点困难。如果我理解正确,你有一个可枚举的selectedProducts
,其中包含几个ID。您还有order
个对象的枚举,它们有两个我们关注的属性,ProductId
和CustomerId
,它们是整数。
在这种情况下,这应该做的工作:
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