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)))