我有一个EventLogEntry对象:
EventLog aLog = new EventLog("Application");
IEnumerable<EventLogEntry> logentry=aLog.Entries.Cast<EventLogEntry>();
现在我正在尝试通过InstanceId在logentry
上创建动态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)之间的所有事件向他展示
有办法吗?
答案 0 :(得分:1)
为什么不将Linq Contains 与列表/数组一起使用?
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)
);