2016-08-23 4 views
3

なぜ単一のクエリは、複数のクエリとは異なる結果を返しますか?動的linq複数対単一の.whereクエリ

query.Where("666 = ID"); 
query.Where("ActiveFrom < @0 && ActiveTo > @1 && ValidFrom < DateTime.Now && ValidTo > DateTime.Now", toDate, fromDate); 

query.ToString();での結果:

SELECT * 
    FROM [Country] AS [Extent1] 
    WHERE 666 = [Extent1].[ID] 

とで

query = query.Where("ActiveFrom < @0", toDate); 
query = query.Where("ActiveTo > @0", fromDate); 
query = query.Where("ValidFrom < DateTime.Now"); 
query = query.Where("ValidTo > DateTime.Now"); 

結果を呼び出し、複数のと同じクエリ:呼び出しがクエリを変更いけないので

SELECT * 
FROM [Country] AS [Extent1] 
WHERE (666 = [Extent1].[ID]) AND 
([Extent1].[ActiveFrom] < convert(datetime2, '2016-10-23 11:40:35.9538054', 121)) AND 
([Extent1].[ActiveTo] > convert(datetime2, '2016-06-23 11:40:35.9518052', 121)) AND 
([Extent1].[ValidFrom] < (SysDateTime())) AND 
([Extent1].[ValidTo] > (SysDateTime())) 
+1

わからない - =クエリーを設定しました"最初の場所"と次に2番目の場所はどこですか? –

+2

'query.Where(" 666 = ID ");'はこのクエリを変数に代入していないので何もしませんが、2番目の例ではそれを行います。 –

答えて

2

異なるWhere sが適切であるようにするためにあなたが戻っqueryに割り当てる必要があります。

//instead of: 
query.Where("666 = ID"); 
query.Where("ActiveFrom < @0 && ActiveTo > @1 && ValidFrom < DateTime.Now && ValidTo > DateTime.Now", toDate, fromDate); 

//do: 
query = query.Where("666 = ID"); 
query = query.Where("ActiveFrom < @0 && ActiveTo > @1 && ValidFrom < DateTime.Now && ValidTo > DateTime.Now", toDate, fromDate); 

またWhere呼び出しは連鎖させることができます。ほとんどのlinq拡張メソッドはIEnumerable<TSource>を返すので、チェーン化することができます。それは次のようになります。あなたの2番目のクエリにチェーンを適用

それは愚かな質問ですが、コードによって、あなたが投稿...最初の例であれば
query = query.Where("ActiveFrom < @0", toDate) 
      .Where("ActiveTo > @0", fromDate) 
      .Where("ValidFrom < DateTime.Now") 
      .Where("ValidTo > DateTime.Now"); 
1

、彼らはret代わりに、変更されたクエリを表す新しいインスタンスを返します。したがって、2番目の例では大きなクエリが生成されますが、最初のクエリでは単純な条件でのみ結果が得られます。

関連する問題