使用Linq to Entities在单个查询中选择多个属性。我在lambda表达式中有if else条件来选择这样的属性:
Repository.Select(
x => Condition1 ? x.Property1 : x.Property2,
y => Condition2 ? y.Property1 : y.Property2,
z => .....);
生成的sql不必要地复杂。我想让它不包括if else条件的开始。有没有办法让它来评估条件,即只是
x=> x.Property1
在生成sql之前?
答案 0 :(得分: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 :(得分:1)
我想这取决于条件是每个数据集还是每行。如果查询返回的每一行的Condition1都为true或false,则必须将其提交给数据库进行评估。
否则Condition1,如果它是真的并且可以在运行查询之前在C#中进行评估,则对于每一行都是如此,在这种情况下,您可以在C#中进行评估并根据结果进行不同的投影,例如< / p>
if (Condition1 && Condition2) {
Repository.Select(x => x.Property1,
y => y.Property1
} else if (...) {
...
}
对于很多条件可能并不理想,但据我所知,这将是一种停止为数据库发送不必要的条件的方法。