2010-07-20 26 views
10

Luchando un poco hoy.Si las declaraciones dentro de un Linq where clause

que tienen el siguiente método que devuelve una lista de products..lovely.

public static List<tblWeight> GetProductInfo(string memberid, string locationid, string basematerial, string source) 
     { 
      MyEntities getproductinfo = new MyEntities(); 

      return (from p in getproductinfo .tblWeights 
         where p.MemberId == memberid && 
           p.LocationId == locationid && 
           p.BaseMaterialName == basematerial && 
           p.WeightStatus == source 
         select p) 
         .ToList(); 
  • Dónde Componentes principales & fuente son listas desplegables.

¿Cómo hago para incorporar algunas declaraciones de IF en la cláusula where?

Por ejemplo, si no se toca el elemento base ddl pero se selecciona un elemento en la fuente ddl, el resultado devolverá todo lo relacionado con el material base pero filtrado por la fuente seleccionada.

¿Eso ni siquiera tiene sentido ?!

Ni siquiera estoy seguro de que estoy tomando el enfoque correcto - por favor, perdona mi ignorancia.

+1

¿Puedes aclarar "si el ddl del material base no se toca pero se ha seleccionado un elemento en la fuente ddl"? – bits

+0

DDL significa lo que en este contexto? –

+0

Lo siento bits - Entonces, si un usuario no selecciona nada de la lista desplegable de elementos básicos, entonces esencialmente el conjunto de datos no será 'filtrado' por este criterio. –

Respuesta

16

puedes añadirlos a su consulta en necesidad:

var r = (from p in getproductinfo .tblWeights 
         where p.MemberId == memberid && 
           p.LocationId == locationid && 
           p.WeightStatus == source 
         select p) 

if (!String.IsNullOrEmpty(basematrial)) 
    r = r.Where(p => p.BaseMaterialName == basematerial); 

return r.ToList(); 
+0

Hola, Moi: muchas gracias por esta solución, me ha ayudado mucho y es fácil de implementar. –

10

considerar la implementación de estos métodos de extensión con nombre WhereIf.

se le pasen dos parámetros: una declaración evaluado a un valor lógico, y una función lambda. Si la declaración de bool se evalúa como verdadera, se agrega la lambda.

WhereIf on ExtensionMethod.net

Su consulta podría ser:

return getproductinfo.tblWeights 
      .Where(w=> w.MemberId == memberid && 
        w.LocationId == locationid) 
      .WhereIf(!string.IsNullOrEmpty(basematerial), w=>w.BaseMaterialName == basematerial) 
      .WhereIf(!string.IsNullOrEmpty(source), w=>w.WeightStatus == source)       
      .ToList(); 

Aquí están, por tanto IEnumerable y IQueryable. Esto le permite usar .WhereIf() en LINQ to SQL, Entity Framework, Lists, Arrays y cualquier otra cosa que implemente esas 2 interfaces.

public static IEnumerable<TSource> WhereIf<TSource>(this IEnumerable<TSource> source, bool condition, Func<TSource, bool> predicate) 
{ 
    if (condition) 
     return source.Where(predicate); 
    else 
     return source; 
} 

public static IEnumerable<TSource> WhereIf<TSource>(this IEnumerable<TSource> source, bool condition, Func<TSource, int, bool> predicate) 
{ 
    if (condition) 
     return source.Where(predicate); 
    else 
     return source; 
} 

public static IQueryable<TSource> WhereIf<TSource>(this IQueryable<TSource> source, bool condition, Func<TSource, bool> predicate) 
{ 
    if (condition) 
     return source.Where(predicate); 
    else 
     return source; 
} 

public static IQueryable<TSource> WhereIf<TSource>(this IQueryable<TSource> source, bool condition, Func<TSource, int, bool> predicate) 
{ 
    if (condition) 
     return source.Where(predicate); 
    else 
     return source; 
} 
+0

Hola, p..campbell: gracias por tu aporte, me ha dado mucho que pensar. Sin embargo, implementé la solución de moi marcada como la respuesta. Sin embargo, estoy seguro de que usaré su solución en algún momento, así que responderé la respuesta tanto como pueda. –

+2

Para el IQueryable he tenido que añadir .AsQueryable() para el retorno: 'volver source.Where (predicado) .AsQueryable();' –

Cuestiones relacionadas