c# - 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,那就太好了。
想法?
解决方案
您可以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();
});
推荐阅读
- django - Django - 如何在基本模板中动态生成菜单
- rest - 如何为现有的 MEAN Stack 应用程序创建 REST API?
- c# - UWP 应用本地设置
- firebase - Requirejs - 尝试使用 firebase 脚本时出错
- angular - Angular 2 模型绑定
- java - Spring TaskExecutor 实现队列优先级
- php - 将以下代码放入控制器后出现错误
- r - R中的单进程(共享内存)多CPU并行
- xml - 使用 XPATH 将 XML 拆分为 5 个块
- azure-service-fabric - 服务结构失败并显示服务状态:fabric:/testsfApplication/tessf 未准备好,没有容器正在运行