Saltar al contenido

Uso de DateDiff con la biblioteca Linq.Dynamic para obtener registros de hoy

Deseamos enseñarte la mejor solución que hemos encontrado on line. Deseamos que te resulte de ayuda y si puedes comentarnos algo que nos pueda ayudar a crecer hazlo con libertad.

Solución:

Usar DbFunctions

.Where(p => DbFunctions.DiffDays(p.AddedDate, DateTime.Now) == 0)

Editar:

Si desea invocar esto dinámicamente, deberá modificar el código para Dynamic LINQ.

  1. Descargue el proyecto de muestra que contiene DynamicLibrary.cs. El archivo se encuentra en la carpeta App_Code.
  2. Encuentra el static definición de predefinedTypes y añadir typeof(DbFunctions) al final.

Ahora podrás hacer esto:

.Where("DbFunctions.DiffDays(AddedDate, DateTime.Now) = 0")

Y se traducirá a este SQL:

WHERE 0 = (DATEDIFF (day, [Extent1].[AddedDate], SysDateTime()))

flindeberg tiene razón cuando dice que System.Linq.Dynamic analiza la expresión que das como C#, no como SQL.

Sin embargo, Entity Framework define la clase “DbFunctions” que le permite llamar a funciones sql como parte de sus consultas Linq.

DbFunctions.DiffDays es el método que está buscando. Con esto, tampoco necesita usar System.Linq.Dynamic.

Su código sería algo como esto, creo:

     var _list = new vsk_error_log();
     using ( var entities = new vskdbEntities() )
     
        _list = entities.vsk_error_log
          .Where( entry => DbFunctions.DiffDays( entry.added_date, DateTime.UtcNow ) == 0 )
          .ToList();
     
     return _list;

Si desea utilizar esta función con System.Linq.Dynamic, se vería así:

     var _list = new vsk_error_log();
     using ( var entities = new vskdbEntities() )
     
        _list = entities.vsk_error_log
          .Where( "DbFunctions.DiffDays( added_date, DateTime.UtcNow ) == 0" )
          .ToList();
     
     return _list;

¡SIN EMBARGO! System.Linq.Dynamic no reconocerá la clase DbFunctions y, como tal, esto no funcionará de inmediato. Sin embargo, podemos “parchar” esta funcionalidad usando un poco de reflejo, aunque puede ser un poco feo:

     var type = typeof( DynamicQueryable ).Assembly.GetType( "System.Linq.Dynamic.ExpressionParser" );

     FieldInfo field = type.GetField( "predefinedTypes", BindingFlags.Static | BindingFlags.NonPublic );

     Type[] predefinedTypes = (Type[])field.GetValue( null );

     Array.Resize( ref predefinedTypes, predefinedTypes.Length + 1 );
     predefinedTypes[ predefinedTypes.Length - 1 ] = typeof( DbFunctions );

     field.SetValue( null, predefinedTypes );

Al ejecutar este código, System.Linq.Dynamic ahora reconocerá DbFunctions como un tipo que se puede usar en las expresiones de C# analizadas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *