Web API动态LINQ搜索

时间:2016-07-11 09:22:42

标签: c# asp.net linq asp.net-web-api iqueryable

我有一个对象BookData:

@import "bootstrap-sprockets";
@import "bootstrap";
@import "static_pages";
@import "users";

我试图实现一个功能,我可以通过书籍对象中的任何属性/字段进行搜索。

例如,要返回PublishedDate = 2016和Genre =" Thriller"的所有书籍。如何创建动态搜索方法,因为搜索字段的数量可能不同。例如。我可以使用所有字段或只搜索一个字段。

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

到目前为止,我有这样的事情:

 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
 }

但上述情况并非动态,而且肯定有更好/更清洁的方式。

如果您可以提供帮助,我将非常感激,因为我对此非常陌生。

提前致谢。

1 个答案:

答案 0 :(得分:1)

如上面的评论所述,您可以使用表达式树来完成此操作。它将完成您需要做的事情,但可能不完全可行,具体取决于数据集的大小;如果你做表达式树,你在内存中进行过滤,如果你有大数据集,可能会导致性能问题。

另一种选择是在存储过程中进行过滤。例如,使用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路由并不是可持续的。

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

Expression Trees

希望有所帮助