2016-07-11 4 views
1

나는 객체 BookData 있습니다.웹 API 동적 LINQ 검색

예를 들어 PublishedDate = 2016 및 Genre = "Thriller"인 모든 책을 반환하려면 다음과 같이하십시오. 검색 필드의 수가 다를 수 있으므로 어떻게 동적 검색 방법을 만들 수 있습니까? 예 : 모든 필드를 사용하거나 하나만 사용하여 검색 할 수 있습니다.

public IList<BookData> SearchBookBy(arguments) { 

//return list of books which match the search criteria 
//e.g. Title contains "love" AND Genre="Romance" AND PublishDate=2015 
} 

지금까지,이 같은 있습니다

public IList<BookData> ListBooksBy(string title, string genre, int publishedDate, int bookId, string author) 
    { 
     var books = ListAllBooks(); 
    var bk = from m in books 
      select m; 

    bk = books.Where(
     (s => 
        (s.Title.ToUpper().Contains(title.ToUpper())) 
       || (s.BookId.ToString().Contains(bookId)) 
       || (s.Genre.ToUpper().Contains(genre.ToUpper())) 
       || (s.PublishedDate.ToString().Contains(publishedDate)) 
       || (s.Authors.ToString().Contains(author)) 
      )).ToList(); 

    books. bk.ToList(); 
    return books; 
} 

을하지만 위의 동적 아니며, 반드시이 일을 더 나은/청소기 방법이있다.

매우 신중하기 때문에 도와 주시면 감사하겠습니다.

미리 감사드립니다.

+0

가장 좋은 방법은 [System.Linq.Dynamic] (https://github.com/kahanu/System.Linq.Dynamic) 또는 [LinqToQueryString] (https://github.com/beyond-code-github)을 구현하는 것입니다./LinqToQuerystring) –

+0

동적 필터링을 만드는 방법은 표현 트리를 엉망으로 만드는 것입니다 : 필터가있는 객체를 얻고 속성에 따라 표현식 트리를 만든다. 아마도 OData 컨트롤러를 제외하고는 상자 솔루션이 없다고 생각합니다. – Chizh

+1

실제 쿼리에서 사용하기 전에 각 인수를 null로 확인하여 성능을 향상시키기 위해 쿼리를 분할해야합니다 . 또한 동적 모델이 없으므로 동적 쿼리 작성기가 필요하지 않습니다. 즉, 런타임에 BookData 속성이 변경되지 않습니다 (값은 0이지만 그 밖의 것은 없습니다) –

답변

1

위의 설명에서 언급 한 것처럼 표현 트리를 사용하여이를 수행 할 수 있습니다. 그것은 당신이해야 할 일을 할 것이지만, 당신의 데이터 세트의 크기에 따라 완전히 불가능할 수도 있습니다; 표현식 트리를 수행하는 경우 메모리에서 필터링을 수행하면 큰 데이터 세트가있는 경우 성능 문제가 발생할 수 있습니다.

또 다른 옵션은 저장 프로 시저에서 필터링을 수행하는 것입니다.

@Authors VARCHAR(50) = NULL, 
@Genre VARCHAR(50) = NULL, 
@BookId VARCHAR(50) = NULL, 
@PublishedDate VARCHAR(50) = NULL, 
@Title VARCHAR(50) = NULL 

을 다음 where 절에서 필터링 : SQL 서버는, 예를 들어, 당신이 당신의 매개 변수를 기본값으로 사용할 수 있습니다 사용하면 다음과 같이 NULL로 못생긴 SQL있게, 당신은 아마해야

WHERE (Authors LIKE @Authors OR @Authors IS NULL) 
AND  (Genre LIKE @Genre OR @Genre IS NULL) 
AND  (BookId LIKE @BookId OR @BookId IS NULL) 
AND  (PublishedDate LIKE @PublishedDate OR @PublishedDate IS NULL) 
AND  (Title LIKE @Title OR @Title IS NULL) 

데이터 유형을 정리하지만 아이디어를 얻을 수 있습니다. SQL 경로를 이동하는 것은 많은 수의 검색 매개 변수에 대해 실제로 지속 가능하지 않습니다.

Expression Trees

희망

을하는 데 도움이 : 당신은 식 트리의 경로를 이동하기로 결정하는 경우

, 난 당신이 시작점으로 사용할 수있을 프리젠 테이션을 위해 쓴 데모 프로젝트가