不求值两次的条件运算符
本文关键字:两次 条件运算符 | 更新日期: 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;