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」もあることがわかります。

更新: 私の主な目標は、ユーザーが 123、456-789、1000-1005 のような InstanceId 範囲を要求できるようにすることです。次の InstanceId 123 と 456-789 の間のすべてのイベントを表示する適切なクエリを (動的に) 作成する必要があります。 (および 1000-1005)

それを行う方法はありますか?

4

1 に答える 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));

編集

複数の範囲を適用するには、最小/最大タプルのコレクションを使用してから、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 に答える