2013-05-24 13 views
7

Mam bazę danych PostgreSQL, która współdziała z programem za pośrednictwem Entity Framework Code First.Używanie DateTime w LINQ do jednostek

Baza danych zawiera tabelę "użytkownicy", która ma kolumnę typu "odwiedziny" DateTime.

Aplikacja jest opisana jako;

public class Users 
{ ... 
    [Required] 
    [Column("visit")] 
    public DateTime VisitDate 
    ... 
} 

Próbuję uruchomić to zapytanie;

var rslt = context.Visitors.Where(v => v.VisitDate.Date == DateTime.Now.Date).ToList() 

Ale coraz wyjątek: NotSupportedException

Co się stało?

+0

Czy możesz podać szczegółowe informacje o swoim wyjątku? –

+0

możesz użyć 'var rslt = context.Visitors.Where (v => v.VisitDate.Date == DateTime.Now) .ToList()' – Saravanan

+0

@saravanan Myślę, że możesz oznaczać 'Datetime.Today' zamiast' DateTime Teraz? –

Odpowiedz

10

Właściwość DateTime.Date nie jest obsługiwana. Zamiast tego należy użyć metody SqlFunctions.DatePart. Kończy się to metodą DATEPARTTSQL w wygenerowanym zapytaniu SQL.

var rslt = context.Visitors 
        .Where(v => SqlFunctions.DatePart("year", v.VisitDate) == SqlFunctions.DatePart("year", DateTime.Now)) 
        .Where(v => SqlFunctions.DatePart("dayofyear", v.VisitDate) == SqlFunctions.DatePart("dayofyear", DateTime.Now)) 
        .ToList(); 
+2

Dziękuję za odpowiedź, ale ponownie otrzymuję komunikat NotSupportedException. Ale wiadomość zawiera inne informacje: Określona metoda "System.Nullable'1 [System.Int32] DatePart (System.String, System.Nullable'1 [System.DateTime])" na typ "System.Data.Objects.SqlClient. SqlFunctions "nie można przetłumaczyć na wyrażenie składowe LINQ to Entities. Może to problem PostgreSQL? – pma11

3

Problem polega na tym, że dostawca LINQ próbuje przekonwertować DateTime.Now.Date na metodę bazy danych, której nie może domyślnie wykonać. Sztuczka polegająca na porównywaniu dat polega na utworzeniu instancji DateTime, której składnik czasu jest ustawiony na wartość domyślną. Możesz uzyskać więcej informacji here i here.

1

MAYUR Borad za odpowiedź (IMHO bardziej poprawne niż zaakceptowanej odpowiedzi) stała się nieaktualna:

System.Data.Entity.Core.Objects.EntityFunctions jest przestarzała. Zamiast tego należy użyć System.Data.Entity.DbFunctions.

var today = DateTime.Today; // (Time already removed) 

var bla = context.Contacts 
    .FirstOrDefault(x => DbFunctions.TruncateTime(x.ModifiedDate) == today); 
Powiązane problemy