gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:22:59 24 4
gpt4 key购买 nike

这是一个查询:

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

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

但我需要在他们购买了所有产品的地方收集 CustomerID。例如,如果有人购买了产品 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;

但是它会给出这个错误:除了 Contains 运算符外,局部序列不能用于查询运算符的 LINQ to SQL 实现。

最佳答案

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

但由于您的查询提供程序不支持在查询中将内存序列与数据库表混合(Contains 除外,它被转换为 SQL IN (value_list)) ,您需要 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

关于c# - 获取其 ID 等于某些值的项目列表 - linq c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45138437/

24 4 0
文章推荐: C# Func getObject 的目的是什么?
文章推荐: c# - 线程 block