3

说我有以下内容:

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

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

4

5 回答 5

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
            }
于 2012-05-09T19:43:44.027 回答
2

是的。

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

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

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

于 2012-05-09T19:42:01.177 回答
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
于 2012-05-09T19:42:03.077 回答
0

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

MyDate = 
  (temp = db.MyTables.FirstOrDefault(x => x.MyID == idToFind).DateValue) == DateTime.MinValue) 
    ? DateTime.Now 
    : temp
于 2012-05-09T19:42:28.620 回答
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;
于 2012-05-09T19:43:35.917 回答