首页 > 解决方案 > n个sql交集

问题描述

给定下表:

MeasureID FilterID
--------- --------
3         1
3         2
4         1
4         2
4         3
4         4
4         5
5         1

我希望能够选择由 n 个度量的交集产生的过滤器 ID。

Example:
MeasureID 3, 4 results in FilterID 1, 2
MeasureID 3, 4, 5 results in FilterID 1
MeasureID 4 results in FilterID 1, 2, 3, 4, 5

SQL 查询会很好,我知道这可以通过以下方式完成:

select m.FilterID from MeasureFilter m
where m.MeasureID = 3

intersect

select m.FilterID from MeasureFilter m
where m.MeasureID = 4

但有可能选择 10 或 100 项措施。

最终,这将使用 LINQ 和实体框架在 C# 中生成。我知道这可以在某种类型的 C# 循环中完成,但如果想出一些声明性的 LINQ,那就太好了。

想法?

标签: c#sqlentity-frameworklinq

解决方案


您可以Aggregate与种子一起使用。

例如

var measures = new List<MeasureFilter>{
    new MeasureFilter(3,1),
    new MeasureFilter(3,2),
    new MeasureFilter(4,1),
    new MeasureFilter(4,2),
    new MeasureFilter(4,3),
    new MeasureFilter(4,4),
    new MeasureFilter(4,5),
    new MeasureFilter(5,1),
};


// all your MeasureIds that you need
var mIds = new List<int> { 3, 4, 5 };

var res = mIds.Aggregate(new List<int>(), (list, next) =>
{
    if (!list.Any()) //need to initially fill list otherwise no intersection
        return measures
            .Where(m => m.MeasureId == mIds.First())
            .Select(m => m.FilterId)
            .ToList();
    return list
        .Intersect(measures.Where(m => m.MeasureId == next)
        .Select(m => m.FilterId))
        .ToList();
});

推荐阅读