2017-11-05 24 views
1

私はメインのクエリを注入するために条件を2つ以上持っていますが、条件に値がない場合(nullableの場合)、私はクエリに注入したくありません。Entity Framework linqクエリでOR条件を挿入する方法は?

たとえば、これは私のANDクエリ注射である:

// first initialize query can have where or not 
var query = context.QuestionInfoes.Include(x =>x.RelationsInfoes).AsQueryable(); 

// first if condition to inject query 
if (filterQuestionInfo.ToProfileId.HasValue) 
{ 
    query = (from q in query 
      join qr in context.QuestionRelationsInfoes on q.Id equals qr.QuestionId 
      where q.BrodcastType == QuestionBrodcastType.All || filterQuestionInfo.ToProfileId == qr.ToProfileId 
      select q); 
} 

// second if condition to inject AND query and i want to this be OR injection 
if (filterQuestionInfo.ProfileId.HasValue) 
{ 
    query = (from q in query 
      where q.ProfileId == filterQuestionInfo.ProfileId 
      select q); 
} 

は、今私は、注射を作成する「OR」にしたいと私は.ToList()を呼び出すときに、私はちょうど私が必要なSQLで問い合わせる参照してください。上の例では、ToProfileIdProfileIdの値がある場合、2番目のクエリは最初のクエリの "And"条件であるため、ToProfileIdの値と0の質問をProfileIdの値の0質問に送信しました。しかし、私は両方の値を記入すると、両方の値が必要になります。

  1. 二つの値がnullです:ToProfileIdかのプロファイルIDの一つの値がnullのとき、私は質問のすべて(機能するようになりました)

  2. をフィルタ:私はその価値に疑問のすべてをフィルターヌル(作品ではありません今)

    両方の値が満たされている
  3. 、私は質問リストの両方をしたい(現在は動作しません)

注:私は1つのクエリAを作成する必要はありませんその条件にすべての条件を挿入してください。

+0

代わりに「=」あなたの2番目のクエリquery.Add(........)が必要です。後でフィルタリングして重複をなくすことができます。 – jdweng

+0

再生のために、query.Addとは何ですか? –

+0

最初のクエリ(.....から)をToList()に追加すると、2番目のクエリを追加できます。 – jdweng

答えて

0

QuestionRelationsInfoesQuestionRelationsInfoesというナビゲーションプロパティとしてQuestionInfoesに存在すると仮定すると、joinは必要ありません。

残念ながら、3つのシナリオ(両方のフィルタセット、1番目のフィルタセットのみ、2番目のフィルタセットのみ)に基づいてクエリを構築する必要があります。

代替として
var query = context.QuestionInfoes.Include(x => x.RelationsInfoes); 

if (filterQuestionInfo.ToProfileId.HasValue && filterQuestionInfo.ProfileId.HasValue) 
{ 
    query = query.Where(q => 
     q.BrodcastType == QuestionBrodcastType.All || 
     q.QuestionRelationsInfoes.ToProfileId == filterQuestionInfo.ToProfileId || 
     q.ProfileId == filterQuestionInfo.ProfileId); 
} 
else if (filterQuestionInfo.ToProfileId.HasValue) 
{ 
    query = query.Where(q => q.BrodcastType == QuestionBrodcastType.All || filterQuestionInfo.ToProfileId == q.QuestionRelationsInfoes.ToProfileId); 
} 
else if (filterQuestionInfo.ProfileId.HasValue) 
{ 
    query = query.Where(q.ProfileId == filterQuestionInfo.ProfileId); 
} 

あなたは、コードの繰り返しを嫌う場合は、フィルタがnullでない場合、あなたが最初にチェックすることで、SQLにチェックをプッシュすることができます。

var query = context.QuestionInfoes.Include(x => x.RelationsInfoes); 

if (filterQuestionInfo.ToProfileId.HasValue || filterQuestionInfo.ProfileId.HasValue) 
{ 
    query = query.Where(q => 
     (filterQuestionInfo.ToProfileId.HasValue && (q.BrodcastType == QuestionBrodcastType.All || filterQuestionInfo.ToProfileId == q.QuestionRelationsInfoes.ToProfileId)) || 
     (filterQuestionInfo.ProfileId.HasValue && q.ProfileId == filterQuestionInfo.ProfileId)); 
} 
+0

あなたのコードでは、 "または"コードインジェクションはありません。ifとelseを使ってすべてのクエリーを1つのクエリーに分割します。あなたのコードは機能しますが、作業を簡単にし、重複したコードを取り除くコードインジェクションを探します。 –

+0

また、filterQuestionInfoで設定されたプロパティに基づいてExpression <>を手動で作成してみることもできますが、その簡単な例はありません。 – Kerry

関連する問題