2010-03-13 3 views
21

J'essaie d'utiliser LINQ pour retourner une liste de tâches qui se trouvent dans l'un des trois états. Ces états sont les suivants:C# - LINQ Déclarations avec les clauses OR

10 - Terminé 11 - incomplet 12 - Ignoré

L'état est disponible dans une propriété appelée "TaskStateID". Je peux le faire dans LINQ avec juste un état comme indiqué ici:

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 
} 

Comme le montre le commentaire ci-dessus, comment puis-je utiliser un « OU » dans une déclaration LINQ dire p.TaskStateID == 10 OU p .TaskStateID == 11 OU p.TaskStateID == 12?

Merci

Répondre

30

Utilisez le OR (||) opérateur:

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

Utilisez l'opérateur conditional OR:

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

Très simple: vous utilisez ORs logiques.

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

C# lambdas ne pas utiliser un sous-ensemble du langage C#: ils utilisent tout le langage. Tout ce qui est possible en C# est disponible pour lambdas. La seule exigence est que l'expression doit retourner le bon type; et même alors, vous pouvez utiliser des accolades pour englober un code plus complexe:

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 pour la maintenabilité! –

+0

Tant que vous mettez l'opérateur lambda au bon endroit ... oh, et rappelez-vous que cela va créer une fermeture. –

+0

Vous pouvez également utiliser uniquement Contient avec des chaînes. – Hemslingo

2

La façon la plus simple:

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

Ou vous pouvez aussi faire quelque chose comme ceci:

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