【问题标题】:Linq to Sql select mapping items with one of many id'sLinq to Sql 选择具有多个 id 之一的映射项
【发布时间】:2012-05-08 23:24:44
【问题描述】:

脑筋急转弯,需要一个简单/快速的答案 - 我可能从错误的角度看待这个问题,但本周我有很多事情要做。 :-(

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

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

例子:

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

因此,如果我选择类别 1 和 2,则返回两个人员项目,但是如果我选择了 1、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&lt;int&gt;,取自发送到查询的数据,它可以是任意长度。并且数据要么是 IQueryable。

知道如何构建这个查询吗?

T

【问题讨论】:

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


    【解决方案1】:

    编辑:这不是有效的 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();
    

    返回两个可枚举的交集,基本上应该和catIDs一样长。

    【讨论】:

      【解决方案2】:

      这个怎么样? Mudu 用完全相同的解决方案击败了我,所以这是我的替代方案。

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

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

      【讨论】:

      • 我最终使用了这个版本(也许我把这个例子简化到了我的成本)。结果类似于:'data = (from a in data.ToList() where catIDs.All(x=> a.MySpecialismCategoryClientCompanyMappings.Select(m=>m.SpecialismCategoryID).Contains(x)) select a).Distinct ().AsQueryable();'
      • 很酷的大佬。如果数据是 IEnumerable,我猜你不需要“data.ToList()”。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2011-04-20
      • 1970-01-01
      相关资源
      最近更新 更多