2011-02-11 7 views
12

Estoy buscando actualizar una de mis consultas a medida que los requisitos para la búsqueda han cambiado. Originalmente, el usuario debía ingresar un solo SKU y un mfg. rango de fechas para buscar en el catálogo de productos. Entonces esto es lo que usé.Consulta de LINQ a SQL donde comienza una cadenaCon un elemento de una lista genérica

DateTime startDate = ...; 
DateTime endDate = ...; 
string prodSKU = TextSKU.Text.Trim(); 

var results = from c in db.Products 
       where c.is_disabled == false 
       && c.dom >= startDate 
       && c.dom <= endDate 
       && c.sku.StartsWith(prodSKU) 
       select c; 

Ahora el requisito dice que el usuario puede introducir una lista delimted comas de SKUs en el cuadro de texto a buscar. Lo que me deja perplejo es cómo encontrar todos los productos en mfg. rango de fechas que comienza con cualquiera de los SKU en skuList (sin usar un ciclo fornext).

string prodSKU = TextSKU.Text.Trim(); 
List<string> skuList = prodSKU.Split(new char[] { ', ' }).ToList(); 

var results = from c in db.Products 
       where c.is_disabled == false 
       && c.dom >= startDate 
       && c.dom <= endDate 
       // && c.sku.StartsWith(prodSKU) 
       select c; 

¡Cualquier idea sería muy apreciada!

Respuesta

18

Algo como

string prodSKU = TextSKU.Text.Trim(); 
List<string> skuList = prodSKU.Split(new char[] { ', ' }).ToList(); 

var results = from c in db.Products     
    where c.is_disabled ==false     
    && c.dom >= startDate     
    && c.dom <= endDate     
    && skuList.Any(sl=>c.sku.StartsWith(sl))     
     select c; 
+0

Buena respuesta. Me tomó demasiado tiempo para volver y leer comentarios, pero llegué a una solución similar. – Jamiec

3
string prodSKU = TextSKU.Text.Trim(); 
List<string> skuList = prodSKU.Split(new char[] { ', ' }).ToList(); 

var results = from c in db.Products 
       where c.is_disabled == false 
       && c.dom >= startDate 
       && c.dom <= endDate 
       && skuList.Contains(c.sku) 
       select c; 

EDIT: Voy a poner esto aquí a pesar de que esta pregunta ya está contestada.

I lograron la misma que la solución aceptada, pero utilizando un método de extensión para ayudar a la legibilidad:

public static class StringExtensions 
{ 
    public static bool StartsWithAny(this string s, IEnumerable<string> items) 
    { 
     return items.Any(i => s.StartsWith(i)); 
    } 
} 

y después la solución es:

var results = from c in db.Products 
      where c.is_disabled == false 
      && c.dom >= startDate 
      && c.dom <= endDate 
      && c.sku.StartsWithAny(skuList) 
      select c; 
+0

Noté que faltaba And, pero no el nombre var. ¡Woops! Eliminé mi respuesta ya que era idéntica a este anways. – asawyer

+0

¿cómo se dirige esto a la parte .StartsWith? –

+0

@Andy: ¿quiere decir que los usuarios pueden escribir en una lista de sku separados por comas, pero aún desea la funcionalidad 'StartsWith'? – Jamiec

Cuestiones relacionadas