2011-08-03 44 views
0

我有这下面的代码,其中我筛选出类型不是“type1”。动态查询linq使用c#where条款

List = Details.Where(p => p.Type != Constants.Type1).ToList(); 

现在我必须动态创建where查询,其中我可以有更多的子句来过滤数据。

所以上面的代码修改后的版本是

List = Details.Where(p => p.Type != Constants.Type1 && p.Type != Constants.Type2).ToList(); 

请指点我如何在C#实现这个

+0

不确定asp.net是如何关联的? – gideon

回答

3
var ExcludedTypes = new Type[] { Constants.Type1, Constants.Type2 }; 
List = Details.Where(p => !ExcludedTypes.Contains(p.Type)).ToList(); 
2

您只需拨打Where多次(记住,这将不会影响你调用它的查询;只是返回值)。例如:

var query = Details.Where(p => p.Type != Constants.Type1); 
if (avoidType2) 
{ 
    query = query.Where(p => p.Type != Constants.Type2); 
} 
List = query.ToList(); 

编辑:请注意,我会用这种方法来通用动态过滤。如果你总是想按类型过滤,而这只是有效类型的变化列表,那么我会用George的方法。

+0

但在你的代码中,它不会迭代两次1来检查type1,然后再次检测type2。我不能一次性做到这一点吗? – Amit

+0

@Amit:不,它不会。 * exact *行为将取决于您的提供者(例如,LINQ to SQL vs LINQ to Objects),但* logical *结果是每个筛选器依次*应用于查询返回的每个项目。请注意,由于LINQ的惰性,“Where”调用本身并不执行迭代。 –

+0

所以你的意思是当你做“List = query.ToList();”在你的代码中,实际的过滤是在哪里完成的,而不是我们称之为“where”方法的地方? – Amit