Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取其ID等于某些值的项目列表-linq c#_C#_Linq - Fatal编程技术网

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

获取其ID等于某些值的项目列表-linq c#,c#,linq,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将显示在结果中 但我需要收集客户购买所有产品的地方

以下是一个问题:

from order in db.tblCustomerBuys
where selectedProducts.Contains(order.ProductID)
select order.CustomerID;
selectedProducts
是一个包含一些目标产品ID的列表,例如它是
{1,2,3}
。 上面的查询将返回他们购买了一种
selectedProducts
的CustomerID。例如,如果有人购买了产品1或2,其ID将显示在结果中

但我需要收集客户购买所有产品的地方的客户资料。例如,如果有人购买了产品1、2和3,那么结果就是这样

如何编辑此查询

TBL客户购买的产品如下所示:

CustomerID - ID of Customer
ProductID - the product which the customer has bought
CustomerID      ProdcutID
---------------------------
110              1
110              2
112              3
112              3
115              5
大概是这样的:

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;
但它会给出以下错误:
本地序列不能用于查询运算符的LINQ到SQL实现中,但Contains运算符除外。

您可以使用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
List selectedProducts=new List(){1,2}//此列表将包含所需的产品ID
db.tblcustomerbuids.where(o=>selectedProducts.Any(p=>p==o.ProductID)).select(o=>o.order.CustomerID);//这将返回购买productID 1或2的所有customerid

您可以使用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
List selectedProducts=new List(){1,2}//此列表将包含所需的产品ID
db.tblcustomerbuids.where(o=>selectedProducts.Any(p=>p==o.ProductID)).select(o=>o.order.CustomerID);//这将返回购买productID 1或2的所有customerid

在编写问题时,理解您的结构有点困难。如果我理解正确,您有一个可枚举的
selectedProducts
,其中包含多个ID。您还可以枚举
order
对象,它们有两个我们关心的属性,
ProductId
CustomerId
,它们是整数

在这种情况下,应该这样做:

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

我们在这里所做的是根据客户的
CustomerId
将所有客户分组在一起,这样我们就可以将每个客户视为一个单一的价值。然后,我们将
视为
所选产品的超集
,并使用通常用于检查一个枚举是否是另一个枚举的子集的linq技巧。我们基于此筛选
db.tblcustomer购买
,然后选择每个匹配订单的
CustomerId

在编写问题时,理解您的结构有点困难。如果我理解正确,您有一个可枚举的
selectedProducts
,其中包含多个ID。您还可以枚举
order
对象,它们有两个我们关心的属性,
ProductId
CustomerId
,它们是整数

在这种情况下,应该这样做:

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

我们在这里所做的是根据客户的
CustomerId
将所有客户分组在一起,这样我们就可以将每个客户视为一个单一的价值。然后,我们将
视为
所选产品的超集
,并使用通常用于检查一个枚举是否是另一个枚举的子集的linq技巧。我们基于此筛选
db.tblcustomerBuilds
,然后选择每个匹配订单的
CustomerId

更新的查询是问题的常规LINQ解决方案

但是,由于您的查询提供程序不支持将内存中的序列与查询中的数据库表混合(除了在(值列表)中将
包含的
转换为SQL
),因此您需要另一种等效的
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

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

但是,由于您的查询提供程序不支持将内存中的序列与查询中的数据库表混合(除了在(值列表)
中将
包含的
转换为SQL
),因此您需要另一种等效的
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

我认为您还需要添加数据库的结构。订单和订单中的产品是如何联系的?在
tblCustomerBuys
的一个条目中,一个产品的多次购买看起来如何?到目前为止,我只看到一个字段
ProductID
,它(我假设)只有一个值。还是我wrong@MongZhu:这是客户和(购买的)产品之间的关系表。所以重复
CustomerID
意味着该客户购买了多个产品。@TimSchmelter现在我明白了,但它会给出错误什么错误(消息)?最后,您能否指定使用的LINQ提供程序,显然不是LINQ to对象支持所有编译的构造。我认为您也需要添加数据库的结构。订单和订单中的产品是如何联系的?在
tblCustomerBuys
的一个条目中,一个产品的多次购买看起来如何?到目前为止,我只看到一个字段
ProductID
,它(我假设)只有一个值。还是我wrong@MongZh