1

设想:

  • 模块 1 有标签 AB
  • 模块 2 有标签 AB
  • 模块 3 有标签 A
  • 模块 4 有标签 B
  • 模块 5 有标签 ABC

在表中:

ModuleId TagId
1         A
1         B
2         A
2         B
3         A
4         B
5         A
5         B
5         C

健康)状况:

  • 我有 TagId ex 的列表: List<> tagList = { A, B }
  • 我希望所有这些 TagIds 都属于同一个 ModuleId,而不是 TagIds 列表(即 tagList)。因此,它应该返回 TagId C。

TSQL 语句 -

select TagId 
from Table
where ModuleId in (
     select ModuleId 
     from Table
     where TagId in(A,B)
     group by ModuleId having count(ModuleId) = 2 )
and TagId not in (A,B)

LINQ 语句 -

List<int?> temp = (from t1 in context.Table
                            where tagList.Contains(t1.TagId)
                            group t1 by t1.ModuleId into grouped
                            where grouped.Count() == tagList.Count()
                            select grouped.Key).ToList();

           var result = (from t2 in context.Table
                    where temp.Contains(t2.ModuleId) && !tagList.Contains(t2.TagId)
                    select t2).Distinct().ToList();

所以我的问题是——

  • 这种情况下的最佳方法应该是什么?
  • 如果有更好的方法,那么它的 LINQ 方法语法是什么?

提前致谢。

4

1 回答 1

0

这是对您的要求的一种更简单的翻译,但它产生的 SQL 会随着您的 tagList 变大而变得更加复杂:

// Get items from the table
from t in context.Table
// ... that belong to modules
group t by t.ModuleId into moduleTags
// ... that have items for all the tags in the tagList
where tagList.All(tagId => moduleTags.Any(t => t.TagId == tagId))
from t in moduleTags
// ... but which themselves don't have the same tags as in the tagList.
where !tagList.Contains(t.TagId)
select t;

从那开始,但利用您的“Count == Count”技巧,这是一个相当简单的实现,应该可以更好地扩展:

// Get items from the table
from t in context.Table
// ... that belong to modules
group t by t.ModuleId into moduleTags
// ... that have items for all the tags in the tagList
where moduleTags.Count(t => tagList.Contains(t.TagId)) == tagList.Count()
from t in moduleTags
// ... but which themselves don't have the same tags as in the tagList.
where !tagList.Contains(t.TagId)
select t;

后一种实现,就像您的原始 SQL 一样,假定您的表条目和 tagList 都只有不同的条目。否则计数将关闭。

于 2013-11-01T21:43:24.220 回答