Linq to Sql选择具有多个id之一的映射项

时间:2012-05-08 14:45:28

标签: c# asp.net linq-to-sql

有大脑锁定并且需要一个简单/快速的答案 - 我可能从错误的一端看这个,但本周我的盘子里有很多。 : - (

使用linq-to-sql,我有一个表,其中的项目通过映射表映射到许多类别。

我现在需要提取所有映射到多个类别的项目,但只显示映射到所需类别的所有项目。这是对原始摘要的更改,该摘要用于提取映射到任何类别ID的数据。

示例:

人A被映射到类别1,类别2和第3类 人B被映射到第1类和第3类

所以,如果我选择1类& 2返回两个人物品,但如果我选择1,2和2 3只应归还A人。

以下是返回任何项目的原始(简化)代码:

IList<Person> results = (from a in data from b in a.CategoryMappings 
                   where catIDs.AsEnumerable().Contains(b.CategoryID) 
                   select a).Distinct().ToList();

catIDs是从发送给查询的数据中获取的IList<int>,可以是任意长度。数据要么是IQueryable。

知道如何构建此查询吗?

Ť

2 个答案:

答案 0 :(得分:2)

编辑:这不是LINQ to SQL,而是LINQ to Objects。无论如何,可能有助于作为灵感来源。

您可以使用Intersect method

var results = (from a in data
               where catIDs.Intersect(a.CategoryMappings).Count() == catIDs.Count
               select a).Distinct().ToList();

它返回两个enumerabled的交集,它应该基本上与catIDs一样长。

答案 1 :(得分:0)

Howsaboutthis? Mudu用完全相同的解决方案打败了我,所以这是我的替代方案。

如果catIDs列表中的所有元素都满足条件,则只从数据中选择对象,p.CategoryMappings必须包含该元素。

var results = from p in data 
              where catIds.All(i => p.CategoryMappings.Contains(i))
              select p;