[英]Linq select all numbers that are in any interval from another list of intervals
我正在尝试编写linq lambda select来获取数据库中的所有记录,这些记录的编号与其他列表或数据库表中的任何特定时间间隔相同。 可以说我有一张桌子“SOURCE” +------+------+-------+------+------+ | Col1 | Col2 | reqNr | col5 | col6 | +------+------+-------+------+------+ | x | x | 9 | x | x | | x | x | 14 | x | x | | x | x | 19 | x | x | | x | x | 24 | x | x | +------+------+-------+------+------+
+------+------+-------+------+------+ | Col1 | Col2 | reqNr | col5 | col6 | +------+------+-------+------+------+ | x | x | 9 | x | x | | x | x | 14 | x | x | | x | x | 19 | x | x | | x | x | 24 | x | x | +------+------+-------+------+------+
+------+------+-------+------+------+ | Col1 | Col2 | reqNr | col5 | col6 | +------+------+-------+------+------+ | x | x | 9 | x | x | | x | x | 14 | x | x | | x | x | 19 | x | x | | x | x | 24 | x | x | +------+------+-------+------+------+
我已经选择了表“INTERVALS” +------+----+ | from | to | +------+----+ | 1 | 3 | | 5 | 10 | | 15 | 30 | +------+----+
+------+----+ | from | to | +------+----+ | 1 | 3 | | 5 | 10 | | 15 | 30 | +------+----+
+------+----+ | from | to | +------+----+ | 1 | 3 | | 5 | 10 | | 15 | 30 | +------+----+
到c#中的对象列表“intervalList”。 如何在linq sql语句中编写“.Where()”部分以获取“SOURCE”中具有“ReqNr”列值的所有记录,该列值落在“intervalList”列表的任何间隔中。 例如: .where(w => intervalList.any(w.ReqNr > intervalList.from && w.ReqNr < intervalList.to))
将where和Any作为内部谓词应用于以下方法:
var result = SOURCE
.Where(d => INTERVALS.Any(e => e.from<d.reqNr && e.to>d.reqNr))
.ToList();
你可以这样做:
var result = iRec
.Where(r => intervalList.Any(i => i.From <= r.reqNr && i.To >= r.reqNr))
.ToList();
你可以在这里查看 。
据我了解你的问题,你需要在数据库端执行查询, intervals
列表是内存中的列表。
您需要一个如下所示的SQL查询:
SELECT * FROM SOURCE WHERE
((1 < reqNr) AND (3 > reqNr))
OR ((5 < reqNr) AND (10 > reqNr))
OR ((15 < reqNr) AND (30 > reqNr))
如您所见,查询本身是动态的。 OR条件的数量和内容取决于间隔列表(在内存列表中)。
要生成这样的动态查询,您需要动态构建Expression<Func<Item,bool>>
并将其传递给Where
方法。 ( Item
是Source表的实体名称)。
您可以使用LinqKit创建这样的动态表达式:
Expression<Func<Item, bool>> condition =
intervals
.Select(
interval =>
(Expression<Func<Item, bool>>)
(x => interval.From < x.reqNr && interval.To > x.reqNr))
.Aggregate(LinqKit.PredicateBuilder.Or);
var result = context.SourceTable
.Where(condition)
.ToList();
顺便说一句,这个解决方案很复杂,因为间隔列表在内存中。 更简单的解决方案是使用存储在数据库中的间隔直接查询数据库,如下所示:
var result =
context.SourceTable
.Where(x =>
context.Intervals.Any(interval =>
interval.From < x.reqNr && interval.To > x.reqNr))
.ToList();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.