我在这里问一个关于在C#中使用LINQ进行高级过滤时代码会是什么样子的问题。我有Linq的经验,但这是出于我的理解。
假设我们有一个类Item
,其中包含(string)Name
,(bool)New
和(int)Price
属性,用户必须输入他们的过滤器并获得所需的结果。< / p>
假设我们将5个对象放在列表list
中,这是一个项目列表。
new Item("Pen",true,12);
new Item("PostIt",false,35);
new Item("Phone",true,140);
new Item("Watch",true,5);
new Item("Lavalamp",false,2);
现在我想要处理这些信息以便获取..所有新的时间都超过10.我知道我可以用
List<Item> Results = list.where(item => item.Price> 10 && item.New).ToList();
但是,如果用户想要获得价格超过10的所有商品,无论是否为新商品,该怎么办?我不能在运行时更改查询以满足需求,我不认为这样做对每个可能的输入参数组合的查询是一种正确的方法...有人能给我一个如何做到这一点的例子吗?
答案 0 :(得分:5)
您可以定义基本查询
var result = list.Where(item=> item.Price > 10); //DON'T Call ToList() here
if(someCondition)
result = result.Where(item=> item.New);
//in the end you are calling
return result.ToList();
就像@MikeEason所说,你不想在你的第一个结果上调用ToList()
,因为这将执行查询。您的目标是构建复杂查询并仅执行一次。因此,当您返回结果时就会这样做。
答案 1 :(得分:3)
如果您只有这三个条件,那么您可以通过几个步骤构建查询:
IEnumerable<Item> result=list;
int Price=10;
bool FilterByPrice, bool FilterByNew;//Set this variables in your environment
if(FilterByPrice)
result=result.Where(item => item.Price> Price);
if(FilterByNew)
result=result.Where(item => item.New);
您的查询将在您致电ToList
方法时执行,或者由于deferred execution而重复查询结果。
答案 2 :(得分:1)
因此,假设您的项目存在于数据库中,并且您想查询它们。如果用户只想查看新项目或全部项目,则会有一个复选框。如果选中此框,则为其设置bool值。
//Compose the query
var results = _db.Where(item => item.Price > 10 );
//still composing
if(onlyNewItems)
{
results = results.Where(item => item.New);
}
//ToList() executes the query, data is returned;
return results.ToList();
这不会运行查询两次。实际上,在您实现查询之前,您仍在撰写它。如果您现在返回它,它将是IQueryable<T>
类型。只有在您致电.ToList()
后,您的查询才会真正执行,并且在这种情况下您会IEnumberable<T>
返回List<T>
。
答案 3 :(得分:0)
List<Item> Results = list.where(item => item.Price > 10
&& (condition ? item.New : true)).ToList();
你可以通过这种方式扩展。如果你的情况是假的,那么只要通过true
,就好像什么也没发生一样。