Web API 动态 LINQ 搜索



我有一个对象 BookData:

public class BookData
{
    public BookData();
    public string[] Authors{ get; set; }
    public string Genre { get; set; }
    public int BookId { get; set; }
    public int PublishedDate{ get; set; }
    public string Title { get; set; }
}

我正在尝试实现一个函数,我可以在其中按 book 对象中的任何属性/字段进行搜索。

例如,返回"出版日期=2016"和"类型"="惊悚片"的所有书籍。如何制作动态搜索方法,因为搜索字段的数量可能会有所不同。例如,我可以使用所有字段或仅使用一个字段进行搜索。

 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;
}

但以上不是动态的,肯定有一种更好/更清洁的方法。

如果您能提供帮助,我将不胜感激,因为我对此很陌生。

提前谢谢。

如上面的注释中所述,您可以使用表达式树执行此操作。 它将执行您需要执行的操作,但可能不完全可行,具体取决于数据集的大小;如果执行表达式树,则在内存中进行筛选,如果数据集较大,则可能会导致性能问题。

另一种选择是在存储过程中执行筛选。 例如,使用 SQL Server,您可以将参数默认为 NULL,如下所示:

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

然后在您的 where 子句中过滤:

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,你可能应该清理数据类型,但你明白了。 对于大量搜索参数,使用 SQL 路由并不是真正可持续的。

如果您决定走表达式树路线,我有一个为演示文稿编写的演示项目,您可以将其用作起点:

表达式树

希望有帮助

相关内容

  • 没有找到相关文章

最新更新