2010-10-28 213 views
1

有关如何从PredicateBuilder中获得更多信息的快速问题。它的工作原理按如下:LINQ to SQL - 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); 
} 

的问题是,如果我想通过任意成员,以及搜索,即传递函数的字符串[]作为关键字,但也现场通过搜索,例如fieldToSearch,并替换p => p.Description.Contains(temp));有什么东西允许通过fieldToSearch搜索?

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

回答

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

0

为什么没有一个单独的方法,该方法需要一个Expression<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);