Wystąpił wyjątek podczas wdrażania poniższych instrukcji.
DateTime result;
if (!DateTime.TryParse(rule.data, out result))
return jobdescriptions;
if (result < new DateTime(1754, 1, 1)) // sql can't handle dates before 1-1-1753
return jobdescriptions;
return jobdescriptions.Where(j => j.JobDeadline.Date == Convert.ToDateTime(rule.data).Date );
Wyjątek
The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.
Wiem, co oznacza wyjątek, ale nie wiem, jak się go pozbyć. Jakaś pomoc?
entity-framework
linq-to-entities
mgławica
źródło
źródło
.Date
.Odpowiedzi:
LINQ to Entities nie może przetłumaczyć większości metod .NET Date (w tym użytego rzutowania) na SQL, ponieważ nie ma odpowiednika SQL.
Rozwiązaniem jest użycie metod Date poza instrukcją LINQ, a następnie przekazanie wartości. Wygląda na to, że błąd powoduje Convert.ToDateTime (rule.data) .Date.
Wywołania Date we właściwości DateTime również nie można przetłumaczyć na język SQL, więc obejściem jest porównanie właściwości .Year .Month i .Day, które można przetłumaczyć na LINQ, ponieważ są to tylko liczby całkowite.
źródło
j.JobDeadline.Date
?Możesz użyć metody TruncateTime EntityFunctions, aby uzyskać poprawne tłumaczenie
Date
właściwości na SQL:Aktualizacja:
EntityFunctions
jest przestarzała w EF6, użyjDbFunctions.TruncateTime
źródło
ruleData
jest toDateTime
typ ij.JobDeadline
skrócony czas. To nie jest w porządku. Nie dostałem wyjątku, ale nie uzyskałem również oczekiwanego rezultatu.JobDeadline
mają tę samą datę corule.data
, bez względu na porę dnia . Czy to nie jest to, co chcesz osiągnąć za pomocą pytania w pytaniu? Dlaczego nie wydaje się to właściwe?EntityFunctions
jest przestarzałe w EF6, powinieneś teraz używaćDbFunctions
.System.Data.Entity
: msdn.microsoft.com/en-us/library/Dn220142(v=VS.113).aspxW przypadku EF6 zamiast tego użyj DbFunctions.TruncateTime (mydate).
źródło
„EntityFunctions.TruncateTime” lub „DbFunctions.TruncateTime” w ef6 Działa, ale występuje problem z wydajnością w Big Data.
Myślę, że najlepszym sposobem jest takie zachowanie:
jest to lepsze niż używanie części daty do. ponieważ zapytanie działa szybciej w przypadku dużych ilości danych.
źródło
EntityFunctions.TruncateTime
(później zastąpione przezDbFunctions.TruncateTime
) są implementowane przez konwersję do SQL, w którym data / godzina jest konwertowana na ciąg i jest obcinana. To sprawia, że zapytanie działa znacznie wolniej, proporcjonalnie do liczby przetwarzanych rekordów.Musisz dołączyć
using System.Data.Entity;
. Działa dobrze nawet zProjectTo<>
źródło
Oznacza to, że LINQ to SQL nie wie, jak zamienić
Date
właściwość na wyrażenie SQL. Dzieje się tak, ponieważDate
właściwośćDateTime
struktury nie ma odpowiednika w języku SQL.źródło
U mnie to zadziałało.
Źródło: fora Asp.net
źródło
Mam ten sam problem, ale pracuję z zakresami dat i godzin. Moim rozwiązaniem jest manipulowanie czasem początkowym (z dowolną datą) na 00:00:00 i czasem końcowym na 23:59:59, więc nie mogę już dłużej konwertować daty i godziny na datę, a raczej pozostanie to data i godzina.
Jeśli masz tylko jedną datę i godzinę, możesz również ustawić godzinę rozpoczęcia (z dowolną datą) na 00:00:00 i godzinę zakończenia na 23:59:59. Następnie wyszukujesz tak, jakby był to przedział czasu.
Możesz to zrobić również z DateTime-Range:
źródło
możesz dostać Enum na przykład:
źródło
Jak wielu tutaj zauważyło, korzystanie z funkcji TruncateTime jest powolne.
Najłatwiejszą opcją, jeśli możesz, jest użycie EF Core. Potrafi to zrobić. Jeśli nie możesz, to lepszą alternatywą dla obcinania jest nie zmienianie w ogóle pola, którego dotyczy zapytanie, ale zmodyfikowanie jego granic. Jeśli wykonujesz zwykłe zapytanie typu „pomiędzy”, w którym dolna i górna granica są opcjonalne, poniższe wskazówki załatwią sprawę.
Zasadniczo zamiast przycinać PoDate z powrotem tylko do części Date, zwiększamy górną granicę zapytania i user <zamiast <=
źródło