不求值两次的条件运算符

本文关键字:两次 条件运算符 | 更新日期: 2023-09-27 18:33:44

>假设我有以下内容:

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

有没有办法在不运行两次 LINQ 查询的情况下执行此操作?
我不能先在临时变量中运行它,因为此查询本身就是更大的 LINQ 查询的一部分。

不求值两次的条件运算符

我不能先在临时变量中运行它,因为这个查询是 本身是更大的 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
            }

是的。

var dateValue = db.MyTables.FirstOrDefault(x => x.MyID == idToFind).DateValue;
return dateValue == DateTime.MinValue ? DateTime.Now : dateValue;

现在,当您说该值不能填充到临时值中时,您是什么意思?上面的代码看起来当然能够转换为该模式。

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

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

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

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

使用 LINQ 的 let 语句

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