2017-12-19 6 views
0

です。linq where句に問題があります。コード:値はnullにできません.LAMQの値は

public IEnumerable<SearchResult> Search(int? orderId, string customer, string car, int? type, int? status, string sortBy = null) 
    { 

     var records = Orders.Where(x => (x.Id == orderId || orderId == null) && 
             (string.Format("{0} {1}", x.Customer.Name, x.Customer.Surname).Contains(customer) || string.IsNullOrEmpty(customer)) && 
             (string.Format("{0} {1}", x.Car.Mark, x.Car.Model).Contains(car) || string.IsNullOrEmpty(car)) && 
             (x.OrderType.Id == type || type == null) && 
             (x.OrderStatus.Id == status || status == null)); 


    } 

問題は、注文ID、タイプ、ステータスです。 VSはtitleのように例外をスローします:valueはnull、paramName:valueは指定できません。検索を開始すると、これらのパラメータ(orderId、type、status)が初期化時にnullでなければならないので、奇妙です。

+1

"初期化時にnullでなければなりません"とは何を意味しますか? – Steve

+0

好奇心の中で「注文」のタイプは何ですか?具体的には、 'IQueryable <>'から継承していますか?いずれにしても、nullの 'customer'または' car'を '.Contains()'に渡すので、エラーはほぼ確実です。 'IsNullOrEmpty()'チェックを最初に入れ、 'Contains()'への呼び出しを短くすることで、これを避けることができます。 –

+0

私は、フィルタリングを開始するとこれらのパラメータに値がないことを意味します。なぜなら、すべてのレコードを保持したいからです。 – rico

答えて

1

String.Containsメソッドにnullを渡すと、 "Value cannot be null. ParamName: Value."という例外がスローされます。 これは、customerまたはcarのパラメータがnullであると思われます。ので、私はあなたがこれでパフォーマンスの勝利を持っていると思う

public IEnumerable<SearchResult> Search(int? orderId, string customer, string car, int? type, int? status, string sortBy = null) 
{ 

    var records = Orders; 

    if(orderId!=null) 
    { 
    records=records.Where(x=>x.Id == orderId); 
    } 

    if(!string.IsNullOrWhiteSpace(customer)) 
    { 
    records=records.Where(string.Format("{0} {1}", x.Customer.Name, x.Customer.Surname).Contains(customer)); 
    } 

.. and so on 

} 

+1

それは文字列で失敗し、コレクションで動作しますhttps://dotnetfiddle.net/tKD8s2 – Tuco

+0

コレクション内のアイテムの1つがnullの場合、Contains(null)が有効な検索になり、文字列の文字には適用されません – Tuco

1

は文字列で使用され、与えられたとき、すべてのparametesは、あなたがこのようなあなたのクエリを区切ることができNULL可能であることをNULLが好きではありません含まれてい各パラメータを尋ねると、その値を求めるすべてのアイテムを反復することが防止されます

関連する問題