2010-02-17 14 views

Respuesta

60

Puede rodar sus condiciones independientes en un único predicado si te gusta:

codebase.Methods.Where(x => (x.Body.Scopes.Count > 5) && (x.Foo == "test")); 

O puede usar una por separado Where llamada para cada condición:

codebase.Methods.Where(x => x.Body.Scopes.Count > 5) 
       .Where(x => x.Foo == "test"); 
+1

Considerando grandes cláusulas con mucha información, ¿ambos casos tienen la misma complejidad o el primero es más lento? – dwbrito

+3

@alaxid: Esperaría que el segundo sea * ligeramente * más lento, porque cada llamada 'Donde' incurre en una pequeña sobrecarga adicional (llamada de método, invocación de delegado, etc.). Sin embargo, no me preocuparía esto en ningún escenario cotidiano normal. – LukeH

+0

Estaba buscando. Cualquier(), aparentemente esto funcionó. Gracias ! –

0

como esto ..

codebase.Methods.Where(x => x.Body.Scopes.Count > 5 && x.Body.Scopes.Count < 10); 
1

Lo que habría "Y" representa?

Puede usar una condición estándar & &. No hay necesidad de una "Y":

codebase.Methods.Where(x => x.Body.Scopes.Count > 5 && x.Body.SomethingElse < 14); 
2

En su ejemplo, ¿de dónde vienen de y? El método Where toma una lambda con un solo parámetro de entrada, que representa una sola instancia de la secuencia en la que está operando.

Puede, por supuesto, tener varias condiciones contra x:

Where(x => x.Foo > 5 && x.Bar < 3) 
1

No lo entiendo ¿Qué no puedes hacer?

codebase.Methods.Where(x => x.Head.IsHairy && x.Body != null && x.Body.Scopes.Count > 5); 
+0

La y que lo desconcierta es solo una especie de sustituto del objeto que se probará en el filtro. Puede llamarse un "Delegado anónimo", pero no estoy seguro. En cualquier caso, solo proporciona una variable que puede usar para acceder a las propiedades de su tipo en la expresión lambda. Podría usar cualquier nombre de variable legal. –

5

hay no se puede definir 2 delegados de la misma, donde se puede construir, pero después de unos a otros o poner tanto en la misma condición como esta

var result = codebase.Methods.Where(x => x.Body.Scopes.Count > 5 && x.Body.Scopes.name == ""); 

or 

var result = codebase.Methods.Where(x => x.Body.Scopes.Count > 5) 
     .where(y=> y.Body.Scopes.name == ''); 

or 

var result = codebase.Methods.Where(x => x.Body.Scopes.Count > 5 ) 
.Union(codebase.Methods.Where(y => y.Body.Scopes.name == '' )); 
0
codebase.Methods.Where(x => x.Body.Scopes.Count > 5).Where(x => x.Body.Scopes.TypeName == "Scopes").Where(x => x.Body.Scopes.Level == LEVEL_HIGH);