首页 文章

动态创建linq查询

提问于
浏览
0

我有一个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”也是在运行时添加术语 .

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

有没有办法做到这一点?

1 回答

  • 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));
    

    Edit

    要应用多个范围,可以使用最小/最大元组的集合,然后使用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)
    );
    

相关问题