2017-12-19 4 views
0

내 linq where 절에 문제가 있습니다. 코드 :값은 null이 될 수 없습니다. paramName : LINQ의 값

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 제목에서 예외를 throw합니다 : 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

컬렉션의 항목 중 하나가 null 일 수 있으며 Contains (null)이 유효한 검색 일 수 있습니다. 문자열에있는 문자에는 적용되지 않습니다. – Tuco

1

문자열에 사용하고, 주어 졌을 때 모든 parametes는이 같은 쿼리를 분리 할 수 ​​널 (NULL)임을 NULL을 좋아하지 않는다 포함 각 매개 변수를 묻는 것은 모든 값을 요청하는 항목을 반복하지 못하도록합니다.

관련 문제