2010-03-13 72 views
21

我想使用LINQ返回处于三种状态之一的任务列表。这些状态是:C#LINQ语句与OR子句

10 - 完成 11 - 不完全 12 - 跳过

的状态是可以通过一个名为 “TaskStateID” 属性。我可以在LINQ中只有一个国家这样做如下所示:

var filteredTasks = from task in tasks 
        select task; 

// Do stuff with filtered tasks 

string selectedComboBoxValue = GetFilterComboBoxValue(); 
if (selected ComboBoxValue == 3) 
{ 
    filteredTasks = filteredTasks.Where(p => p.TaskStateID == 10); // How do I use an 'OR' here to say p.TaskStateID == 10 OR p.TaskStateID == 11 OR p.TaskStateID == 12 
} 

如上所示的评论,我怎么使用的“或”在LINQ声明说p.TaskStateID == 10或P .TaskStateID == 11或p.TaskStateID == 12?

谢谢

回答

30

使用OR符(||):

filteredTasks = filteredTasks.Where(p => p.TaskStateID == 10 || 
             p.TaskStateID == 11 || 
             p.TaskStateID == 12); 
7

使用conditional OR操作:

filteredTasks = filteredTasks.Where(p => p.TaskStateID == 10 || 
             p.TaskStateID == 11 || 
             p.TaskStateID == 12); 
1

很简单:你用逻辑的OR。

filteredTasks.Where(p => p.TaskStateID == 10 || p.TaskStateID == 11 || p.TaskStateID == 12) 

C#lambdas不使用C#语言的子集:它们使用整个语言。所有可能的C#都可用于lambdas。唯一的要求是表达式必须返回正确的类型;而且即便如此,你可以使用大括号来包含更复杂的代码:

p => { /* code block that has a return statement here */ } 
1
filteredTasks.Where(p => (p.TaskStateID == 10 || p.TaskStateID == 11 || p.TaskStateID == 12)) 
15
var taskIds = new[]{10, 11, 12} 

var selectedTasks = filteredTasks.Where(p => taskIds.Contains(p.TaskStateID)) 
+0

+1可维护性! – 2010-03-13 17:06:00

+0

只要你把lambda操作符放在正确的地方......哦,并且记住这将创建一个闭包。 – 2010-03-13 17:14:40

+0

您也只能使用包含字符串。 – Hemslingo 2016-07-07 09:16:01

2

最简单的方法:

.Where(p => p.TaskStateID == 10 || p.TaskStateID == 11 || p.TaskStateID == 12) 

或者你也可以做这样的事情:

var states = new int[] {10,11,12}; 
filteredTasks = filteredTasks.Join(states, p => p.state, s => s, (p, s) => p);