3

私が次を持っているとしましょう:

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

そのLINQクエリを2回実行せずにこれを行う方法はありますか?
このクエリ自体がより大きなLINQクエリの一部であるため、最初に一時変数に実行することはできません。

4

5 に答える 5

7

このクエリ自体がより大きな LINQ クエリの一部であるため、最初に一時変数に実行することはできません。

クエリ内で代入を使用できletます (または、ラムダ構文を使用している場合はヘルパー フィールドを含むプロジェクションを使用することもできます。これはとにかくコンパイルされるものです)。

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 に答える