0

我有一个EventLogEntry对象:

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

现在我正在尝试logentry通过它的InstanceId创建一个动态 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)

有没有办法做到这一点?

4

1 回答 1

1

为什么不将 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)
);
于 2012-08-13T20:12:20.940 回答