关于如何从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,并用允许按fieldToSearch进行搜索的内容替换临时字段( p=> p.Description.Contains(Temp)),该怎么办?
这是可能的吗?这是个坏主意吗?
发布于 2010-10-28 09:52:16
对于您想要做的事情,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-28 09:58:09
为什么不使用一个单独的方法将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 );https://stackoverflow.com/questions/4039111
复制相似问题