2012-05-03 25 views
9

DateTime.ToLocalTime no es compatible con Linq a EF.Linq-to-EF DateTime.ToLocalTime no compatible

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

+0

Linq a SQL y Entity Framework no son lo mismo. ¿Qué estás usando? –

+0

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

+1

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

Respuesta

-2

encontrado la solución en este question

public partial class Person { 

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

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

5

En lugar de utilizar .ToLocalTime() dentro de su búsqueda Linq, utilice la conversión opuesta fuera de la consulta de los parámetros.

var dateUniversal = dateParam.ToUniversalTime(); 

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

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

+4

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

+0

Esta es la respuesta correcta para lo que se pidió. –

-1

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

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

De forma similar, si necesita mostrar la hora local del UTC en la base de datos, conviértala en código después de la recuperación de la base de datos.

+1

Soy consciente de esto. Necesito hacer un caso especial y compruebo si puedo ejecutar .ToUniversalTime() o .ToLocalTime() usando linq – ove

+0

Como has encontrado, esta no es una buena idea. Puede que sea mejor arreglando su "caso especial". HTH. –

+0

@in_visible "Otros casos especiales" también se conocen como "wtf" por otros codificadores. – Will

0

Utilicé una combinación de Extensiones además de confiar en el valor pasado desde el front-end de mi aplicación para estar en LocalTime. Entonces, si tuviera dos fechas ... como ... un parámetro de fecha de inicio y fecha de finalización para un informe, los pondría allí ... dejé que el usuario lo envíe en LocalTime ... y luego en la parte posterior de mi Controlador .. Utilizaría las variables de fecha y hora en mi consulta de Linq a Entidades. Los métodos de extensión estáticos que arrojé a una clase de ayuda estática. Perdón por tener 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(); 
    } 
-1

si se obtiene el desplazamiento de la zona horaria del servidor que podría ser capaz de utilizar EntityFunctions aplicar el desplazamiento de la consulta LINQ

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

Convertir DateTime a la cadena por comparación, por ejemplo:

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

Este tipo de hack de comparación de cadenas podría funcionar para una cláusula 'Where'; ¿cómo harías algo similar para 'GroupBy' sin embargo? –

0

Usted puede tratar de esta manera:

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