2

LINQ to SQLクエリに問題があります。サーバーから返されるデータがnullの可能性があります。クエリ内にifステートメントを設定しました。クエリはまだ例外をスローしています。オブジェクト参照がLINQ to SQLクエリ内のインスタンスに設定されていない

検索用語「場所」はnullの場合これは、私は場所によってフィルタリングする必要はありませんが、それは、私nullでない場合、クエリコード

var a = from b in db.branches 
     where (b.Location != null) ? 
     (
      (Query.Location == null) ? 
       true : 
       //The following line causes the exception to be thrown 
       object.Equals(Query.Location.ToLower() , b.Location.ToLower()) 
     ) : 
     (
      (Query.Location == null) ? 
       true : 
       false 
     ) 
     select b; 

のダウン短縮バージョンでありますエントリの一部がnullの場所を持つため、行の値がNULLかどうかを確認する必要があります。

私がコンペアラインに追加するまで、コードは正常に機能します。比較ラインに到達するには、Query.Locationとb.Locationの両方をnullにすることはできません。したがって、コードは失敗しません。

どのような問題が発生する可能性がありますか?

ありがとうございました。

EDIT

私ははObject.equalsから.toLowerを()削除した場合、クエリが正しく実行される、それも関係なく、クエリがであるものの場合に動作しないように管理し、その後呼び出します。

var a = from b in db.branches 
     where (b.Location != null) ? 
     (
      (Query.Location == null) ? 
       true : 
       //The following line causes the exception to be thrown 
       object.Equals(Query.Location , b.Location) 
     ) : 
     (
      (Query.Location == null) ? 
       true : 
       false 
     ) 
     select b; 
+0

を引き起こしていると考えているあなたは何の行を選択しないする必要がありますか? – abatishchev

+0

'b.Location'がnullで、' Query.Location'がnullの場合、すべての行を選択する必要がありますか? – abatishchev

+0

b.locationがnullで、query.locationが返されない場合、返さない b.locationがnullでquery.locationがnullの場合は、 – Midimatt

答えて

3

私はここで間違って何が起こっているのか確かに言うのが好きではないだろうが、私はあなたが実際に二つの異なるクエリにそれを分割することにより、コードが大幅に簡単にすることができると思う:

public void Search(SearchTerms Query) 
{ 
    var queryWithLocation = db.branches.Where(b => 
      Query.Location.Equals(b.Location, StringComparison.OrdinalIgnoreCase); 

    var query = Query.Location != null ? queryWithLocation : db.branches; 
} 

Equalsの方法を変更しました。これが大文字と小文字を区別しない検索を実行する方法です。 LINQ to SQLで動作するかどうかを確認する必要があります。

+1

を返します。@abatishchev:クエリが実行されている場所はどこですか? 。位置はヌルですか? 'Where'を呼び出すと実際にはクエリは実行されません... –

+0

私はそれを分割することができますが、場所は3つの検索語のうちの1つで、nullでもかまいません。可能な組み合わせごとに1つ、かなりの数のクエリが必要になります。例えばqueryWithLocation、queryWithX、queryWithLocationAndX – Midimatt

+0

評価されない場合、そのクエリは実際に実行されません。 –

0

試してみてください。

public void Search(SearchTerms Query) 
{ 
var a = from b in db.branches 
     where (b.Location != null) ? 
     (
      (Query.Location == null) ? 
      true 
      : 
      //The following line causes the exception to be thrown 
      Query.Location.ToLower() == b.Location.ToLower() 

     ) 
     : 
     (
      (Query.Location == null) ? 
      true 
      : 
      false 
     ) 
     select b 
} 

私は、 `b.Location`がnullで、` Query.Location`でない場合 objectはおそらくNullReference

+0

オブジェクトを削除しましたが、依然としてエラーがスローされます – Midimatt

+0

'what'がnullであることを確認するためにデバッガをアタッチしましたか? – ChrisBint

+0

私はvs2010を実行してコードをステップ実行していますが、何がnullであるかわかりません。 – Midimatt

0
from b in db.branches 
let location = b.Location 
where location != null ? 
    b.Location.Equals(b.Location, Query.Location ?? b.Location, StringComparison.OrdinalIgnoreCase) : // if Query.Location is null then select all 
    false // to select nothing in this case 
select b; 
関連する問題