条件运算符没有评估两次?

时间:2012-05-09 19:39:25

标签: c# conditional conditional-operator

说我有以下内容:

MyDate = 
  (db.MyTables.FirstOrDefault(x => x.MyID == idToFind).DateValue == DateTime.MinValue) 
    ? DateTime.Now 
    : db.MyTables.FirstOrDefault(x => x.MyID == idToFind).DateValue

如果没有两次运行LINQ查询,有没有办法做到这一点? 我不能先将它运行到临时变量中,因为这个查询本身就是一个更大的LINQ查询的一部分。

5 个答案:

答案 0 :(得分:7)

  

我无法先将其运行到临时变量中,因为此查询是   它本身就是一个更大的LINQ查询的一部分。

您可以在查询中使用let赋值(或者,如果您使用lambda语法,则可以使用包含辅助字段的投影 - 无论如何都要编译它):

var query = from foo in db.Bar
            let bar = db.MyTables.FirstOrDefault(x => x.MyID == idToFind).DateValue
            select  new 
            {
               MyDate = bar == DateTime.MinValue ? DateTime.Now : bar
            }

答案 1 :(得分:2)

var dateValue = db.MyTables.FirstOrDefault(x => x.MyID == idToFind).DateValue;

return dateValue == DateTime.MinValue ? DateTime.Now : dateValue;

现在,当你说这个值不能填入临时值时,你的意思是什么?上面的代码看起来肯定能够转换为该模式。

答案 2 :(得分:1)

评估一次并分配给变量 - 使用条件中的变量:

var item = db.MyTables.FirstOrDefault(x => x.MyID == idToFind);

MyDate = (item.DateValue == DateTime.MinValue) 
    ? DateTime.Now 
    : item.DateValue

或者:

var theDate = db.MyTables.FirstOrDefault(x => x.MyID == idToFind).DateValue;

MyDate = (theDate == DateTime.MinValue) 
    ? DateTime.Now 
    : theDate

答案 3 :(得分:0)

您仍然可以使用临时变量,声明它,但在该表达式中指定它。 在某些情况下,大量代码可能会使其难以阅读,但至少可以减少重复。

MyDate = 
  (temp = db.MyTables.FirstOrDefault(x => x.MyID == idToFind).DateValue) == DateTime.MinValue) 
    ? DateTime.Now 
    : temp

答案 4 :(得分:0)

使用LINQ的let声明

from a in someSource
let d = db.MyTables.FirstOrDefault(x => x.MyID == a.idToFind).DateValue
select (d == DateTime.MinValue) ? DateTime.Now : d;