2010-03-13 68 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);