2012-11-15 55 views
3

我在C#中的以下LINQ查詢如何組合兩個LINQ表達式?

var stats = from s in context.Stats                         
     select s; 

Expression<Func<Stat, bool>> e1 = s => s.Age >= 15 && s.Age < 25; 
Expression<Func<Stat, bool>> e2 = s => s.Age >= 40 && s.Age < 50; 

stats = stats.Where(e1); 

此代碼的工作,並給了我從統計表,其中年齡爲15一25

之間現在的行,我想獲得的行從15到25 AND從40到50.

如何合併這兩個表達式?

感謝

回答

6

......怎麼

Expression<Func<Stat, bool>> e1 = s => 
    (s.Age >= 15 && s.Age < 25) || (s.Age >= 40 && s.Age < 50); 
+0

哼哼,那工作。 (e1 || e2) 但沒有成功 – stephone

+0

@stephone在這種情況下,我喜歡juharr的解決方案最好的'stats = stats.Where(e1).Union(stats .Where(e2));' –

+0

該解決方案返回所有錶行 – stephone

2

這是一個有點難看,但如果你想保持他們的表情:

stats = stats.Where(s => (e1.Compile()(s) || e2.Compile()(s))).ToList(); 

如果你可以將其更改爲Func小號它更清潔:

Func<Stat, bool> e1 = s => s.Age >= 15 && s.Age < 25; 
Func<Stat, bool> e2 = s => s.Age >= 40 && s.Age < 50; 

stats = stats.Where(s => e1(s) || e2(s)).ToList(); 
0
Expression<Func<Stat, bool>> GetOrExpression(
    Expression<Func<Stat, bool>> e1, 
    Expression<Func<Stat, bool>> e2) 
{ 
    return s => e1.Compile()(s) || e2.Compile()(s); 
} 

Expression<Func<Stat, bool>> e1 = s => s.Age >= 15 && s.Age < 25; 
Expression<Func<Stat, bool>> e2 = s => s.Age >= 40 && s.Age < 50; 

stats = stats.Where(GetOrExpression(e1, e2)); 
+0

,因爲e1/e2是表達式,您將需要執行'e1.Compile(s)|| e2.Compile(s)' – Aducci

+0

嗯,好的,謝謝。 – Rawling

1

你可以做一個聯盟這樣

stats = stats.Where(e1).Union(stats.Where(e2));