2012-01-06 145 views
6

este método devuelve una lista genérica pero tiene varias condiciones para obtener la selección. Estoy escribiendo esto usando if - else if -else if .... many if else me refiero a ¿Hay una manera más corta de hacer esto? Gracias.Linq where cláusula con varias condiciones

public List<ProductReqNoDate> GetRequestsQuery(string departmant, int reqStateID, string firstDate, string lastDate) 
    { 
     var db = new requestsDBEntities(); 
     var listPrn = new List<ProductReqNoDate>(); 
     if (!string.IsNullOrEmpty(departmant)) 
     { 
      return (from r in db.requests 
         where r.departmant== departmant 
         select new ProductReqNoDate 
         { 
          departmant= r.departmant, 
          reqNo = r.reqNo , 
          reqDate = r.reqDate , 
          prdctName= stringCutter((from p in db.products where p.reqNo == r.reqNo select p.prdctName).FirstOrDefault()) 
         }).ToList(); 

     } 
     if (!string.IsNullOrEmpty(firstDate) && !string.IsNullOrEmpty(lastDate)) 
     { 
      DateTime dtfirstDate = Convert.ToDateTime(firstDate); 
      DateTime dtlastDate = Convert.ToDateTime(lastDate); 
      return (from r in db.requests 
         where r.reqDate <= dtlastDate && r.reqDate >= dtfirstDate 
         select new ProductReqNoDate 
         { 
          departmant= r.departmant, 
          reqNo = r.reqNo , 
          reqDate = r.reqDate, 
          prdctName= stringCutter((from p in db.products where p.reqNo == r.reqNo select p.prdctName).FirstOrDefault()) 
         }).ToList(); 

     } 
    } 
+0

Como linq se ejecuta al acceder por primera vez a los resultados, quizás podría colocar el primer 'de/dónde' en una var y luego fuera del ifs, use la nueva consulta seleccionada en el conjunto de resultados recuperados. – Aphelion

Respuesta

1

1 *

podemos encontrar una mejor sollution pero me gustaría que esta ayuda (I cosa) pero lo uso: puede hacer la prueba a cabo esta función

List<ProductReqNoDate> yourList = GetRequestsQuery(string departmant, int reqStateID) 

    if (!string.IsNullOrEmpty(firstDate) && !string.IsNullOrEmpty(lastDate)) 
    { 
     yourdatagrid.Itemsource = yourList.where(a=> a.reqDate <= Datetime.parse(firstDate) & a.reqDate >= Datetime.parse(lastDate)) 
    } 


public List<ProductReqNoDate> GetRequestsQuery(string departmant, int reqStateID) 
{ 
    var db = new requestsDBEntities(); 
    var listPrn = new List<ProductReqNoDate>(); 
    if (!string.IsNullOrEmpty(departmant)) 
    { 
     return (from r in db.requests 
        where r.departmant== departmant 
        select new ProductReqNoDate 
        { 
         departmant= r.departmant, 
         reqNo = r.reqNo , 
         reqDate = r.reqDate , 
         prdctName= stringCutter((from p in db.products where p.reqNo == r.reqNo select p.prdctName).FirstOrDefault()) 
        }).ToList(); 

    } 
} 

y se puede aplique cualquier condición en su primera lista pero no se recomienda en la aplicación havy o mucha información en la base de datos.

2 *

O puede simplemente hacer la primera fecha y la última fecha; por ejemplo, si la fecha no está configurada, realice la primera fecha = 01/01/1900 y la última fecha Fecha.Hoy y siempre pase su fecha en la consulta de linq

+0

bien en realidad, necesito considerar tantas condiciones para obtener valor ... public List GetRequestsQuery (string departmant, int reqStateID, string firstDate, string lastDate, string productName) ... quiero decir si todas las condiciones son ciertas debe darme una respuesta filtrada O uno de ellos es cierto, el resto es falso ... ¿entonces tengo que escribir todas las posibilidades? if (a & b & c & d) else if (a & b & c) else if (a & c & d) else if (b & c & d) else if (a & b) else if (a & c) ... etc? :))) – blackraist

0

algo así no lo compilé y lo revisé pero debería darte una pista.

public List<ProductReqNoDate> GetRequestsQuery(string departmant, int reqStateID, string firstDate, string lastDate) 
{ 
    using(var db = new requestsDBEntities()) 
    { 

     DateTime dtfirstDate =null; 
     DateTime.TryParse(firstDate,out dtfirstDate); 

     DateTime dtlastDate = null; 
     DateTime.TryParse(lastDate,out dtlastDate); 

     var result = (from r in db.requests 
        where 
         (r.departmant == departmant) 
        || (r.reqDate <= dtlastDate.Value && r.reqDate >= dtfirstDate.Value) 
        select new ProductReqNoDate 
        { 
         departmant = r.departmant, 
         reqNo = r.reqNo , 
         reqDate = r.reqDate , 
         prdctName= stringCutter((from p in db.products where p.reqNo == r.reqNo select p.prdctName).FirstOrDefault()) 
        }).ToList(); 
    } 

} 

EDIT:

si desea utilizar funciones que no son de SQL en el filtro a continuación, llamar ToList() en su mesa

var result = db.requests.ToList().Where(r => { 

    // do test for what you want 
    // so write a function to work out when you want to filter by 
    // name or date 
    return true; 

}).Select(r => new ProductReqNoDate 
        { 
         departmant = r.departmant, 
         reqNo = r.reqNo , 
         reqDate = r.reqDate , 
         prdctName= stringCutter(db.products.Where(p=> p.reqNo == r.reqNo).Select(p=> p.prdctName).FirstOrDefault()) 
        }) 

el problema con esto es que está cargando el toda la tabla en la memoria, si está bien si no cambias a los valores a menudo y si no es demasiado grande.

Otro enfoque sería escribirlo como un proceso almacenado que probablemente haría feliz a tu DBA.

+0

¿Qué pasa si todos los parámetros no son nulos, quiero decir si todas las condiciones son verdaderas que deben darme una respuesta filtrada. Para este enfoque 1 condición es suficiente para obtener valor. – blackraist

6

Puede hacer que el núcleo de la consulta como la siguiente:

var query = from r in db.requests 
select new ProductReqNoDate 
        { 
         departmant= r.departmant, 
         reqNo = r.reqNo , 
         reqDate = r.reqDate , 
         prdctName= stringCutter((from p in db.products 
         where p.reqNo == r.reqNo select p.prdctName).FirstOrDefault()) 
        } 

A continuación, aplicar if then else:

if (!string.IsNullOrEmpty(departmant)) 
    return query.Where(r=>r.departmant== departmant).ToList(); 
if (!string.IsNullOrEmpty(firstDate) && !string.IsNullOrEmpty(lastDate)) 
{ 
     DateTime dtfirstDate = Convert.ToDateTime(firstDate); 
     DateTime dtlastDate = Convert.ToDateTime(lastDate); 
     return query.Where(r=> r.reqDate <= dtlastDate && r.reqDate >= dtfirstDate) 
        .ToList(); 
} 

No reduce if then else pero hace más sensible, lo que sucede va.

+0

@Jani, Salam pesar, kojaee? bia también google talk :) –

+1

+1 por tu fantástica respuesta !!!! Avariin :-) – hsalimi

+0

bueno en realidad, necesito considerar tantas condiciones para obtener valor ... public List GetRequestsQuery (string departmant, int reqStateID, string firstDate, string lastDate, string productName) ....quiero decir si todas las condiciones son verdaderas y deben darme una respuesta filtrada. O uno de ellos es cierto, el resto es falso ... ¿entonces tengo que escribir todas las posibilidades? if (a & b & c & d) else if (a & b & c) else if (a & c & d) else if (b & c & d) else if (a & b) else if (a & c) ... etc? :))) – blackraist

Cuestiones relacionadas