나는 객체 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;
}
을하지만 위의 동적 아니며, 반드시이 일을 더 나은/청소기 방법이있다.
매우 신중하기 때문에 도와 주시면 감사하겠습니다.
미리 감사드립니다.
가장 좋은 방법은 [System.Linq.Dynamic] (https://github.com/kahanu/System.Linq.Dynamic) 또는 [LinqToQueryString] (https://github.com/beyond-code-github)을 구현하는 것입니다./LinqToQuerystring) –
동적 필터링을 만드는 방법은 표현 트리를 엉망으로 만드는 것입니다 : 필터가있는 객체를 얻고 속성에 따라 표현식 트리를 만든다. 아마도 OData 컨트롤러를 제외하고는 상자 솔루션이 없다고 생각합니다. – Chizh
실제 쿼리에서 사용하기 전에 각 인수를 null로 확인하여 성능을 향상시키기 위해 쿼리를 분할해야합니다 . 또한 동적 모델이 없으므로 동적 쿼리 작성기가 필요하지 않습니다. 즉, 런타임에 BookData 속성이 변경되지 않습니다 (값은 0이지만 그 밖의 것은 없습니다) –