1

关于如何充分利用 PredicateBuilder 的快速问题。它的工作原理如下:

IQueryable<Product> SearchProducts (params string[] keywords)
{
  var predicate = PredicateBuilder.False<Product>();

  foreach (string keyword in keywords)
  {
    string temp = keyword;
    predicate = predicate.Or (p => p.Description.Contains (temp));
  }
  return dataContext.Products.Where (predicate);
}

问题是,如果我还想通过任意成员进行搜索,即传递函数 string[] 作为关键字,还要传递要搜索的字段,例如 fieldToSearch,并替换 p=> p.Description,该怎么办。包含(温度));允许通过 fieldToSearch 进行搜索?

这可能吗,这是一个坏主意吗?

4

2 回答 2

1

对于您想要做的事情,Dynamic Linq可能更合适。

虽然编写类型安全的查询对于大多数情况都非常有用,但在某些情况下,您希望灵活地动态构建查询。例如:您可能希望在应用程序中提供商业智能 UI,允许最终用户业务分析师使用下拉菜单在数据之上构建和表达他们自己的自定义查询/视图。

传统上,这些类型的动态查询场景通常通过将字符串连接在一起来构建动态 SQL 查询来处理。最近有几个人给我发邮件询问如何使用 LINQ 处理这些类型的场景。下面的文章描述了如何使用 LINQ 团队提供的动态查询库来动态构建 LINQ 查询。

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

于 2010-10-28T01:52:15.663 回答
0

为什么不使用一个单独的方法,将 anExpression<Func<Product,bool>>作为参数。然后在方法外部构建谓词并将其作为参数传递。

IQueryable<Product> SearchProducts (Expression<Func<Product,bool>> selector )
{
    return dataContext.Products.Where( selector );
}

用作

var selector = PredicateBuilder.False<Product>()
                               .Or( p => p.Name == name )
                               .Or( p => p.Vendor == vendor );

products = repository.SearchProducts( selector );
于 2010-10-28T01:58:08.700 回答