繁体   English   中英

Linq从另一个间隔列表中选择任何间隔中的所有数字

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM