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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
Linq 查询子集合-列表中包含的多数共同ID_Linq_Linq To Entities_Intersection - Fatal编程技术网

Linq 查询子集合-列表中包含的多数共同ID

Linq 查询子集合-列表中包含的多数共同ID,linq,linq-to-entities,intersection,Linq,Linq To Entities,Intersection,考虑以下列表: List<long> listOfIDs = new List<long> { 1, 2, 3, 4 }; 虽然我选择了产品1和产品2,但我应该只选择水果公司作为供应商。当我将可口可乐纳入我的列表时,我不想再看到任何供应商,因为没有供应商同时代表这3种产品 预期产出情况: 选定产品:1、2 预期结果:水果公司 1,3 市场公司 1,2,3 空。 1,3,4 空。 3,4 超级饮料公司我想我终于明白了问题所在 因此,您有一个具有多对多关系的两个实体,如下所

考虑以下列表:

List<long> listOfIDs = new List<long> { 1, 2, 3, 4 };
虽然我选择了产品1和产品2,但我应该只选择水果公司作为供应商。当我将可口可乐纳入我的列表时,我不想再看到任何供应商,因为没有供应商同时代表这3种产品

预期产出情况:

选定产品:1、2 预期结果:水果公司

1,3 市场公司

1,2,3 空。

1,3,4 空。

3,4
超级饮料公司我想我终于明白了问题所在

因此,您有一个具有
多对多
关系的两个实体,如下所示:

public class Product
{
    public long Id { get; set; }
    public string Name { get; set; }
    public ICollection<Supplier> Suppliers { get; set; }
}

public class Supplier
{
    public long Id { get; set; }
    public string Name { get; set; }
    public ICollection<Product> Products { get; set; }
}
或者,如果您希望
包含
(两者都生成一个相同的SQL):

(B) 点火柴:

var suppliers = db.Suppliers
    .Where(s => s.Products.Count(p => productIds.Contains(p.Id)) == productIds.Count)
    .ToList();

我不能说哪一个性能更好,但它们都能产生预期的结果,并且得到LINQ to实体的支持。

您的问题取决于这样一个事实,即给定的供应商可以拥有更多与其相关的产品,而不是筛选列表中包含的产品

您只需交换要在linq查询中测试条件的数据源容器即可解决此问题:

db.Table.Where(a => listOfIds.All(b => a.SubTable.Contains(b)))
您还可以通过以下方式读取此查询:

获取所有供应商(
a
记录),其中all
listOfIds
中包含的产品(
b
元素)也必须 包含在与每个供应商相关的产品列表中(
a.子表


问题是…@IvanStoev我做错了什么,我没有得到预期的结果。你得到了我真正需要的。事实上,我有两个多对多的实体。感谢您的明确回答和理解能力。
var suppliers = db.Suppliers
    .Where(s => productIds.All(id => s.Products.Any(p => p.Id == id)))
    .ToList();
var suppliers = db.Suppliers
    .Where(s => productIds.All(id => s.Products.Select(p => p.Id).Contains(id)))
    .ToList();
var suppliers = db.Suppliers
    .Where(s => s.Products.Count(p => productIds.Contains(p.Id)) == productIds.Count)
    .ToList();
db.Table.Where(a => listOfIds.All(b => a.SubTable.Contains(b)))