2015-10-07 44 views
0

使用Linq to Entities在單個查詢中選擇多個屬性。我有,如果然後在lambda表達式條件選擇這樣的屬性:Linq到實體如果查詢中有其他條件

Repository.Select(
x => Condition1 ? x.Property1 : x.Property2, 
y => Condition2 ? y.Property1 : y.Property2, 
z => .....); 

生成的SQL是不必要的複雜。我想讓它不包括開始的其他條件。有沒有辦法讓它評估的條件,即只是

x=> x.Property1 

生成sql之前?

+0

只是表示作爲評估表達式的一個例子。所以也可以計算x => x.Property2 – Willis

回答

4

你想評估條件和服務器端的權利?

一個可能的方法之一是寫輔助方法:

public Expression<Func<TInput, TOutput>> ResolveProp<ITinput, TOutput>(
     Expression<Func<TInput, TOuput>> propSelector1, 
     Expression<Func<TInput, TOuput>> propSelector2, 
     bool condition){ 
    return condition ? propSelector1 : propSelector2; 
} 

用法:

Repository.Select(ResolveProp<SomeEntity, PropType>(
         x => x.Property1, 
         x => x.Property2, 
         Condition1), 
        ...) 

ResolveProp返回單個屬性選擇器作爲表達,基於condition。選擇選擇器是在服務器端完成的,所以你的sql應該被簡化。

1

我想這取決於條件是每個數據集還是每行。如果Condition1對於查詢返回的每一行都是真或假,那麼它必須提交給數據庫進行評估。如果條件1爲真,並且可以在運行查詢之前在C#中對其進行評估,則對於每一行都是如此,在這種情況下,您可以使用C#進行評估,並根據結果進行不同的投影。

if (Condition1 && Condition2) { 
    Repository.Select(x => x.Property1, 
     y => y.Property1 
} else if (...) { 
    ... 
} 

也許不是理想的很多條件,但據我所知,這將是一個辦法阻止發送大量的條件數據庫不必要的評估。