在Ado.NET世界中,我可以拥有如下代码
Void SomeMethod(bool flag)
{
String Query = “ SELECT * FROM Products WHERE CategoryID = 125”;
If ( flag == true )
Query += “ AND Price > 25”
....
}
在Linq世界中,我可以动态添加这些额外的过滤器吗?
答案 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);
}