0

私はここで不可能なことをしようとしているのかもしれません。SingleOrDefault私が構築している式の列挙可能なメソッドにロジックを挿入することは可能ですか?

結果を取得するために使用されるパラメーターを除いて、(2) 同一のクエリ結果が得られます。

ディールは でありIDID2値は両方ともすべての条件で存在するわけではありません。条件に基づいて結果を絞り込む単一の式を作成しようとしています。これが私が達成しようとしていることです:

//'ID' and 'ID2' sre parameters passed into method
var query = Repository.GetQuery<Person>()
                      .Include(x => x.PersonDetail)
                      .SingleOrDefault(
                                       if (String.IsNullOrWhiteSpace(ID))
                                       {
                                         x => x.PersonDetail.ID2 == ID2;
                                       }
                                       else
                                       {
                                         x => x.PersonDetail.ID == ID;
                                       }
                                       );

現在、ビルドされず、次のエラーが発生します。

シンボル PersonDetail を解決できません

わかりましたので、実装を完全に解釈したかもしれませんが、基本的に上記で試みたようなことを行うことができますか、それとも (2) 同じデータをプルする別のクエリを記述し、「決定ロジック」を外部に保持する必要がありますか?表現?

どんな助けでも大歓迎です、ありがとう!

4

2 に答える 2

6

ブランチの状態はわかっているので、ラムダからブランチを引き出すことができます (またそうすべきです):

var query = Repository.GetQuery<Person>()
                      .Include(x => x.PersonDetail);

if (String.IsNullOrWhiteSpace(ID))
{
    query = query.Where(x => x.PersonDetail.ID2 == ID2);
}
else
{
    query = query.Where(x => x.PersonDetail.ID == ID);
}

var result = query.SingleOrDefault();

IDこれを記述する方法は他にもたくさんありますが、重要な部分は、ラムダによるチェックをまったく必要としないということです。

于 2013-02-28T22:07:28.093 に答える
2

これはあなたが望むものです:

var query = Repository.GetQuery<Person>()
                  .Include(x => x.PersonDetail)
                  .SingleOrDefault(String.IsNullOrWhiteSpace(ID) ?
                          x => x.PersonDetail.ID2 == ID2 :
                          x => x.PersonDetail.ID == ID);

簡単に読めるわけではありませんが、ワンライナーで目的を達成できます。

EDIT構文エラーを修正しました。

于 2013-02-28T22:09:30.450 に答える