在Linq中动态添加谓词

时间:2011-12-15 21:58:08

标签: c# linq ado.net

在Ado.NET世界中,我可以拥有如下代码

Void SomeMethod(bool flag)
{
String Query = “ SELECT * FROM Products WHERE CategoryID  = 125”;
If ( flag == true )
  Query += “ AND Price > 25”
....
}

在Linq世界中,我可以动态添加这些额外的过滤器吗?

5 个答案:

答案 0 :(得分:7)

var query = context.Products.Where( p => p.CategoryID == 125 );
if ( flag )
   query = query.Where( p => p.Price > 25 );

答案 1 :(得分:5)

if (someFlag)
    query = query.Where(p => p.Price > 25);

答案 2 :(得分:3)

您可以作为查询的一部分作弊并使用该标志。

var query = from p in Products
            where p.CategoryID == 125
                && (!flag || p.Price > 25)
            select p
            ;

如果你传递额外的标准,你可以将它们应用到可枚举中,并获得一个新的可枚举,正如SLaks和Wiktor Zychla所提到的那样。在致电ToList

之前,系统不会解析查询
IEnumerable<Product> GetProducts(params Func<Product, bool>[] criteria)
{
    var query = Products.Where(p => p.CategoryID == 125);
    foreach(criterion in criteria)
    {
        query = query.Where(criterion);
    }
    return query;
}

// ...

var notFiltered = someObject.GetProducts().ToList();
var filtered = someObject
    .GetProducts(
        p => p.Price > 25,
        p => p.AverageReviewScore > 4
        )
    .ToList();

请注意,如果您使用Linq to Entities而不是Linq to Objects执行此操作,这可能无效,或者您至少必须返回IQueryable而不是IEnumerable。没试过:)

答案 3 :(得分:0)

var data = from p in context.Products 
           where (flag == false && p.CategoryID == 125)
                 || (flag == true && p.CategoryID == 125 && p.Price > 25)
           select p;

答案 4 :(得分:0)

  private void GetData(bool flag)
    {
        var query = from p in db.products
                    where p.CategoryId == 125
                    select p;

            if(flag)
        query = query.Where(o => o.Price > 25);
    }