Linq-a-EF DateTime.ToLocalTime no compatible

DateTime.ToLocalTime no es compatible con Linq a EF.

¿Cuál es la alternativa? Me estoy quedando sin idea.

preguntado el 03 de mayo de 12 a las 12:05

Linq to SQL y Entity Framework no son lo mismo. ¿Cuál estás usando? -

Linq2Sql y Linq2EF son dos productos separados. ¿Cuál es? -

¿Cómo intenta usar ToUniversalTime, en la cláusula where o en la selección? -

Lo siento chicos, debería ser el método ToLocalTime() que estoy tratando de usar. -

@DanFitch: lo mejor que podría hacer serían funciones personalizadas como las de mi Soporte de zona horaria de SQL Server proyecto. Invocar desde EF sería algo difícil. Aún así, es mejor hacer una nueva pregunta para que otros puedan aportar ideas creativas. Esta pregunta en particular aquí solo trata de evitar eso, como escribió Phil en su respuesta. -

7 Respuestas

En lugar de usar .ToLocalTime() dentro de su consulta Linq, use la conversión opuesta fuera de la consulta en los parámetros.

var dateUniversal = dateParam.ToUniversalTime();

var query = myTable.Where( t => t.DateTime > dateUniversal );

contestado el 03 de mayo de 12 a las 13:05

esto no funciona. ToUniversalTime() tiene que estar en la consulta de linq porque la hora es de cada registro de la base de datos. - ove

Si UTC está almacenado en la base de datos, entonces si sus parámetros son UTC, debería funcionar, ¿seguramente? - Phil

Como regla general, debe almacenar fechas y horas en UTC en su base de datos.

Convierta cualquier fecha/hora local a UTC en su código antes de almacenarla en la base de datos.

Del mismo modo, si necesita mostrar la hora local desde UTC en la base de datos, conviértala en código después de la búsqueda de la base de datos.

contestado el 03 de mayo de 12 a las 13:05

Estoy consciente de esto. Necesito hacer un caso especial y descubrí si puedo ejecutar .ToUniversalTime() o .ToLocalTime() usando linq - ove

Como has descubierto, esta no es una buena idea. Podría hacerlo mejor arreglando su "caso especial". HH. - nick mayordomo

Los "casos especiales" de @in_visible también suelen ser conocidos como "wtf" por otros programadores. - Testamento

Utilicé una combinación de Extensiones y me basé en el valor pasado desde el front-end de mi aplicación para estar en LocalTime. Por lo tanto, si tuviera dos fechas y horas... como... una fecha de inicio y un parámetro de fecha de finalización para un informe, las colocaría allí... dejaría que el usuario enviara en LocalTime... luego en la parte trasera de mi controlador .. Usaría las variables sdate y edate en mi Linq to Entities Query. Los métodos de extensión estáticos que arrojé a una clase auxiliar estática. Lo siento, tengo más de un año de retraso. : )

    DateTime sdate = CalcHelper.AbsoluteStart(model.StartDate);
    DateTime edate = CalcHelper.AbsoluteEnd(model.EndDate);

    public static DateTime AbsoluteStart(this DateTime dateTime)
    {
        return dateTime.Date.ToUniversalTime();
    }
    public static DateTime AbsoluteEnd(this DateTime dateTime)
    {
        return AbsoluteStart(dateTime).AddDays(1).AddTicks(-1).ToUniversalTime();
    }

Respondido el 04 de Septiembre de 13 a las 17:09

si obtiene el desplazamiento de la zona horaria del servidor, es posible que pueda usar EntityFunctions para aplicar el desplazamiento en su consulta linq

var offset = TimeZoneInfo.Local.BaseUtcOffset.TotalMinutes;
var result = db.Dates.Where(a => 
             EntityFunctions.DiffDays(EntityFunctions.AddMinutes(a.Date, offset), DateTime.Now) == 0);

Respondido 06 Jul 15, 20:07

Puedes probar así:

var promotions = _promotionService.GetAll(
            x => (DbFunctions.TruncateTime(x.CreatedDate.Value) >= viewModel.GTXFromDate.Date)
            && (DbFunctions.TruncateTime(x.CreatedDate.Value) <= viewModel.GTXToDate.Date));

Respondido 10 Jul 15, 05:07

Convierta DateTime a String para comparar, Por ejemplo:

const string DATE_FORMAT = "yyyy/MM/dd";
var query = sampleTable.Where(x => x.DateTime.ToString(DATE_FORMAT) > DateTime.Now.ToString(DATE_FORMAT));

Respondido 07 Jul 15, 09:07

Este tipo de truco de comparación de cadenas podría funcionar para un Where cláusula; ¿Cómo harías algo similar para GroupBy ¿aunque? - Dan Fitch

Encontré la solución a esto pregunta

public partial class Person { 

  partial void OnLoaded() { 
    this._BirthDate = DateTime.SpecifyKind(this._BirthDate, DateTimeKind.Utc); 
  } 
} 

contestado el 23 de mayo de 17 a las 11:05

Tengo este error. LINQ to Entities no reconoce el método 'System.DateTime SpecificKind(System.DateTime, System.DateTimeKind)' y este método no se puede traducir a una expresión de almacenamiento. - ove

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.