2010-03-22 12 views
5

estoy usando LINQ para consultar los datos. Considere un caso en el que el usuario solo desea informar sobre decir 1 de los 3 campos. (Ver más abajo)¿Desarrollar LINQ dinámico?

¿Puede alguien decirme cómo construir la consulta de forma dinámica?

Gracias

DD

var query = 
    from cl in db.tblClaims 
    join cs in db.tblCases 
     on cl.ref_no equals cs.ref_no 
    where cl.claim_status == "Appeal" 
     && cl.appeal_date >= Convert.ToDateTime(txtReferedFromDate.Text) 
     && cl.appeal_date <= Convert.ToDateTime(txtReferedToDate.Text) 
     && cs.referred_from_lho == dlLHO.Text 
     && cs.adviser == dlAdviser.Text 
    select new 
    { 
     Ref = cs.ref_no, 
     ClaimType = cl.claim_type, 
     ClaimStatus = cl.claim_status, 
     AppealDate = cl.appeal_date 
    }; 

gvReport.DataSource = query; 

Respuesta

5

se podría hacer algo como esto:

var query = from cl in db.tblClaims 
         join cs in db.tblCases 
          on cl.ref_no equals cs.ref_no 
         where cl.claim_status == "Appeal" 
         select new 
         { 
          Ref = cs.ref_no, 
          ClaimType = cl.claim_type, 
          ClaimStatus = cl.claim_status, 
          AppealDate = cl.appeal_date, 
          cs.referred_from_lho, 
          cs.adviser 
         }; 

if(!string.IsNullOrEmpty(txtReferedFromDate.Text) 
    && !string.IsNullOrEmpty(txtReferedToDate.Text)) 
    query = query.Where(cl => 
        cl.appeal_date >= Convert.ToDateTime(txtReferedFromDate.Text) 
       && cl.appeal_date <= Convert.ToDateTime(txtReferedToDate.Text)); 

if(!string.IsNullOrEmpty(dlLHO.Text)) 
    query = query.Where(cl => cl.referred_from_lho == dlLHO.Text); 

if(!string.IsNullOrEmpty(dlAdviser.Text)) 
    query = query.Where(cl => cl.adviser == dlAdviser.Text); 

gvReport.DataSource = 
     query.Select(o => new { o.Ref, o.ClaimType, o.ClaimStatus, o.AppealDate }); 

Esto sólo sería utilizar esos campos como filtros si tenían valores para filtrar, de lo contrario no serían utilizadas en la consulta.

+0

gracias por la ayuda, y gracias por el enlace a la biblioteca, así, apreciados – DarkW1nter

5

lo hacemos pasando un objeto Criteria y luego construir la consulta al anexar los criterios deseados utilizando árboles de expresión.

IQueryable<Data.Story> query = ctx.DataContext.Stories; 

if (criteria.StoryId != null) // StoryId 
    query = query.Where(row => row.StoryId == criteria.StoryId); 

if (criteria.CustomerId != null) // CustomerId 
    query = query.Where(row => row.Project.CustomerId == criteria.CustomerId); 

if (criteria.SortBy != null) // SortBy 
    query = query.OrderBy(criteria.SortBy + " " + criteria.SortOrder.Value.ToStringForSql()); 

if (criteria.MaximumRecords != null) // MaximumRecords 
    query = query.Take(criteria.MaximumRecords.Value); 

var data = query.Select(row => StoryInfo.FetchStoryInfo(row)); 

También puede echar un vistazo a la biblioteca dinámica LINQ en http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

+0

estrictamente hablando, no está utilizando una expresión real definido dinámicamente aquí, pero esto es, no obstante, la solución correcta. –

+0

@ Adam Robinson Buen punto ... estoy realmente construyendo la consulta "añadiendo" ... en lugar de hacer nada "dinámica". ¡Gracias por la aclaración! – mattruma

1

Microsoft ha creado una biblioteca de ejemplo (Dynamic Library LINQ) que le permite construir querys dinámicos en LINQ, se puede ver cómo úselo y descárguelo desde este enlace: http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

Dicho esto, también puede declarar un IQueriable al comienzo de su código y agregar cláusulas where dependiendo de los parámetros. Yo iba a escribir un ejemplo, pero me ganó de mano mattruma :)

Yo prefiero la segunda opción, pero hay situaciones en las que el uso de la biblioteca dinámica es una solución mejor.

0

así:

namespace overflow4 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var orig = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; 

      var newlist = FilterNumbers(orig, true, false, false); 

      foreach (int x in newlist) 
       Console.WriteLine(x); 
      Console.ReadLine(); 
     } 

     private static IEnumerable<int> FilterNumbers(
      List<int> origlist, 
      bool wantMultiplesOf2, 
      bool wantMultiplesOf3, 
      bool wantMultiplesOf5) 
     { 
      IEnumerable<int> sofar = origlist; 

      if (wantMultiplesOf2) 
       sofar = sofar.Where(n => n % 2 == 0); 

      if (wantMultiplesOf3) 
       sofar = sofar.Where(n => n % 3 == 0); 

      if (wantMultiplesOf5) 
       sofar = sofar.Where(n => n % 5 == 0); 

      return sofar; 
     } 
    } 
} 
Cuestiones relacionadas