说我有以下内容:
MyDate =
(db.MyTables.FirstOrDefault(x => x.MyID == idToFind).DateValue == DateTime.MinValue)
? DateTime.Now
: db.MyTables.FirstOrDefault(x => x.MyID == idToFind).DateValue
如果没有两次运行LINQ查询,有没有办法做到这一点? 我不能先将它运行到临时变量中,因为这个查询本身就是一个更大的LINQ查询的一部分。
答案 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;