Linq to entity if if condions in query

时间:2015-10-07 11:51:26

标签: c# entity-framework linq lambda linq-to-entities

使用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之前?

2 个答案:

答案 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 (...) {
    ...
}

对于很多条件可能并不理想,但据我所知,这将是一种停止为数据库发送不必要的条件的方法。