2012-08-13 119 views
0

我有一個EventLogEntry對象:創建動態LINQ查詢

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

你總是比較ID嗎? – James 2012-08-13 20:11:25

回答

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的所有方法,通過每個範圍進行過濾:

// 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) 
); 
+0

我無法獲得範圍(123-456)與此「包含」聲明..所以這不能幫助我..謝謝無論如何 – user986474 2012-08-14 08:20:17

+0

@ user986474我認爲類似的原則適用 - 請參閱我的更新。 – McGarnagle 2012-08-14 15:43:39