は、私は、オブジェクトBookDataを持っています。のWeb API、動的LINQの検索
たとえば、PublishedDate = 2016、Genre = "Thriller"のすべての書籍を返すことができます。検索フィールドの数が異なる可能性があるため、動的検索方法を作成するにはどうすればよいですか。例えば。私はすべてのフィールドまたはただ一つを使って検索することができます。
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;
}
しかし、上記は、動的ではなく、確かにこれを行うためのより良い/クリーンな方法があります:
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
}
これまでのところ、私はこのような何かを持っています。
私が非常に新しいことを助けることができれば非常に感謝します。
ありがとうございます。
あなたの最善の策は[System.Linq.Dynamic](https://github.com/kahanu/System.Linq.Dynamic)または[LinqToQueryString](https://github.com/beyond-code-github)を実装することです。/LinqToQuerystring) –
動的フィルタリングを行う方法は、式ツリーを使いこなすことです:フィルタを持つオブジェクトを取得し、そのプロパティに依存します式ツリーを構築します。 おそらくODataコントローラを除いて、この解決策はありません。 – Chizh
実際のクエリで使用する前に引数をヌルチェックすることで、パフォーマンスを向上させるためにクエリを分割する必要があります。また、動的モデルを持たないため、動的なクエリビルダは必要ありません。つまり、BookDataプロパティは実行時に変更されません(その値のみですが、それ以外は何もありません)。 –