W mojej aplikacji używam Entity Framework.
Mój stół
-Article
-period
-startDate
Potrzebuję rekordów pasujących do => DateTime.Now > startDate and (startDate + period) > DateTime.Now
Wypróbowałem ten kod, ale teraz działa
Context.Article
.Where(p => p.StartDate < DateTime.Now)
.Where(p => p.StartDate.AddDays(p.Period) > DateTime.Now)
Kiedy uruchamiam kod, występuje następujący wyjątek
LINQ to Entities nie rozpoznaje metody „System.DateTime AddDays (Double)”, a tej metody nie można przetłumaczyć na wyrażenie magazynu.
c#
linq
entity-framework
datetime
Yucel
źródło
źródło
period
?AddDays
jest złą funkcją, jeśli jestdouble
.Odpowiedzi:
W przypadku korzystania z LINQ to Entity Framework predykaty wewnątrz klauzuli Where są tłumaczone na język SQL. Otrzymujesz ten błąd, ponieważ nie ma tłumaczenia na SQL,
DateTime.Add()
co ma sens.Szybkim obejściem byłoby odczytanie wyników pierwszej instrukcji Where do pamięci, a następnie użycie LINQ to Objects w celu zakończenia filtrowania:
Możesz również wypróbować metodę EntityFunctions.AddDays , jeśli używasz .NET 4.0:
Uwaga:
EF 6
jest terazSystem.Data.Entity.DbFunctions.AddDays
.źródło
Myślę, że właśnie to próbowała zasugerować ta ostatnia odpowiedź, ale zamiast próbować dodawać dni do p.startdat (coś, czego nie można przekonwertować na instrukcję sql), dlaczego nie zrobić czegoś, co można przyrównać do sql:
źródło
EntityFunctions
rozwiązaniu. Tutaj drugi operand nie jest pobierany z innej jednostki w zapytaniu i można go obliczyć przed zapytaniem. Gdyby oba operandy znajdowały się w db,EntityFunctions
rozwiązanie nadal byłoby odpowiednie, podczas gdy rozwiązanie tej odpowiedzi nie działałoby już.Co powiesz na odjęcie 2 dni od DateTime.Now:
Szczerze mówiąc, nie jestem pewien, co próbujesz osiągnąć, ale może to zadziałać
źródło
Jeśli chcesz, aby twoje wyrażenie zostało przetłumaczone na SQL, możesz spróbować użyć
System.Data.Entity.Core.Objects.AddDays.
Właściwie jest oznaczony jako przestarzały, ale działa. Powinien zostać zastąpiony przez System.Data.Entity.DbFunctions.AddDays, ale nie mogę go znaleźć ...
źródło