繁体   English   中英

动态创建linq查询

[英]Create dynamically linq query

我有一个EventLogEntry对象:

EventLog aLog = new EventLog("Application");
IEnumerable<EventLogEntry> logentry=aLog.Entries.Cast<EventLogEntry>();

现在,我尝试通过InstanceIdlogentry上创建动态linq查询。 我可以运行:

int id=123;
IEnumerable<EventLogEntry> filteredByEventId = logentry.Where((x) => x.InstanceId == id);

但我试图在运行时创建linq术语。 像这样:

int id=123;
int id2=456;
IEnumerable<EventLogEntry> filteredByEventId = logentry.Where((x) => x.InstanceId == id || x.InstanceId == id2);

虽然我知道在运行时也添加了“ id2”一词。

更新:我的主要目标是用户可以要求InstanceId范围,例如123、456-789、1000-1005,并且我需要创建正确的查询(动态地),该查询将向他显示以下InstanceId 123和456-789之间的所有事件(和1000-1005)

有没有办法做到这一点?

为什么不将Linq 包含与列表/数组一起使用?

var ids = new List<int>();
ids.Add(123);
ids.Add(456);
// etc...

IEnumerable<EventLogEntry> filteredByEventId = logentrey.Where((x) => ids.Contains(x.InstanceId));

编辑

要应用多个范围,可以使用最小/最大元组的集合,然后使用Linq All方法按每个范围进行过滤:

// setup ranges
var ranges = new List<Tuple<int, int>>();
ranges.Add(new Tuple<int,int>(123,123));
ranges.Add(new Tuple<int,int>(456,789));
ranges.Add(new Tuple<int,int>(1000,1005));

// apply filter
var filteredByEventId = logentry.Where(x => 
    ranges.All(range => x >= range.Item1 && x <= range.Item2)
);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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