2012-05-03 15 views
9

nie jest obsługiwany w Linq do EF.Linq-to-EF DateTime.ToLocalTime nieobsługiwany

Co to jest alternatywa? Kończy mi się pomysł.

+0

Linq do SQL i Entity Framework to nie to samo. Którego używasz? –

+0

Linq2Sql i Linq2EF to dwa oddzielne produkty. Który to? – spender

+1

Jak próbujesz użyć ToUniversalTime - w klauzuli where lub select? – Phil

Odpowiedz

-2

znaleźć rozwiązanie w tej question

public partial class Person { 

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

Mam ten błąd. LINQ to Entities nie rozpoznaje metody "System.DateTime SpecifyKind (System.DateTime, System.DateTimeKind)", a tej metody nie można przetłumaczyć na wyrażenie składu. – ove

5

Zamiast korzystania .ToLocalTime() wewnątrz zapytania LINQ używać odwrotny konwersji poza zapytania o parametrach.

var dateUniversal = dateParam.ToUniversalTime(); 

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

to nie działa. ToUniversalTime() musi znajdować się w zapytaniu linq, ponieważ czas pochodzi z każdego rekordu bazy danych. – ove

+4

Jeśli UTC jest przechowywane w bazie danych, to jeśli Twoje parametry to UTC, powinno działać - na pewno? – Phil

+0

To jest poprawna odpowiedź na pytanie. –

-1

Co do zasady, należy przechowywać daty i godziny w UTC w bazie danych.

Konwertuj lokalną datę/czas na UTC w swoim kodzie przed zapisaniem ich w bazie danych.

Podobnie, jeśli chcesz pokazać czas lokalny z UTC w bazie danych, przekonwertuj go w kodzie po pobraniu bazy danych.

+1

Jestem tego świadomy. Muszę zrobić specjalny przypadek i stwierdzić, czy mogę uruchomić .ToUniversalTime() lub .ToLocalTime() przy użyciu linq – ove

+0

Jak już ustaliłeś, nie jest to dobry pomysł. Możesz zrobić lepiej, naprawiając "specjalny przypadek". HTH. –

+0

@in_visible "Przypadki specjalne" są zwykle również znane jako "wtf" przez innych programistów. – Will

0

Korzystałem z kombinacji rozszerzeń i polegam na tym, że wartość przekazywana z front-endu mojej aplikacji do LocalTime. Tak więc, jeśli miałbym dwa razy daty, np. ... datę rozpoczęcia i datę końcową dla raportu, wstawiłbym je tam .. pozwól użytkownikowi przesłać w LocalTime .. następnie na tylnej części mojego kontrolera .. Chciałbym użyć zmiennych sdate i edate w moim Linq do Query encji. Metody statycznych rozszerzeń rzuciłem w statyczną klasę pomocniczą. Przepraszam, że spóźniłem się ponad rok. :)

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

jeśli masz strefy czasowej z serwera może być w stanie używać EntityFunctions zastosować przesunięcie w zapytaniu linq

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

Konwersja DateTime do String dla porównania, dla Przykład:

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

Ten rodzaj porównywania hackowania stringów może działać dla klauzuli 'Where'; jak byś zrobił coś podobnego do 'GroupBy' chociaż? –

0

Możesz spróbować tak:

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