2009-07-06 14 views
40

Proszę o pomoc. Próbuję dowiedzieć się, jak używać DATE lub DATETIME dla porównania w kwerendę linq.Jak wykonać porównywanie dat w zapytaniu EF?

Przykład: Gdybym chciał wszystkie nazwy pracowniczych dla tych, którzy rozpoczęli przed dzisiaj, chciałbym zrobić coś takiego w SQL:

SELECT EmployeeNameColumn 
FROM EmployeeTable 
WHERE StartDateColumn.Date <= GETDATE() //Today 

ale co LINQ?

DateTime startDT = //Today 

var EmployeeName = 
from e in db.employee 
where e.StartDateColumn <= startDT 

Powyższy GDZIE nie działa:

Szczegóły wyjątku: System.NotSupportedException: Podany członkowskie typ „data” nie jest obsługiwana w LINQ do podmiotów. Obsługiwane są tylko inicjatory, elementy encji i właściwości nawigacji jednostki.

Odpowiedz

18

To powinno zadziałać. Czy na pewno nie ma innej części zapytania, które spowodowało wyjątek? Mam kilka wystąpień zapytania w moim kodzie zapytań w postaci

+1

To działało: gdzie StartDateColumn <= GETDATE() // Dzisiaj to nie: gdzie StartDateColumn. Data <= GETDATE() // Dzisiaj Miałem .Data w moim oświadczeniu - musiałem już przezwyciężyć tę kwestię. Dziękuję. kam –

+6

To nie jest problem - problemem jest e.AsofDate.Data (porównaj tylko część daty - po obu stronach ... – Dani

2

Jestem ciekawy komunikatu o błędzie z informacją: 'Date', gdy podajesz numer 'DateTime'. Czy to możliwe, że 'StartDateColumn' jest rzeczywiście 'Date', a nie 'DateTime' w bazie danych? To może zepsuć porównanie ...

9

Może to być spowodowane datą w bazie danych podlegającą zerowaniu. Spróbuj tego:

var EmployeeName = 
from e in db.employee 
where e.StartDateColumn.Value <= startDT 
+1

".Value" było dla mnie objawieniem –

5

Nie można używać .Date

Jeśli chcesz sprawdzić dzisiaj można utworzyć datetime z żadnym momencie

DateTime myDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day); 
var e = (from mds in myEntities.Table 
     where mds.CreateDateTime >= myDate 
     select mds).FirstOrDefault(); 
2

spróbować tego:

DateTime dd = DateTime.Parse("08/13/2010 00:00:00"); 
var data = from n in ContributionEligibilities 
      where n.ModifiedDateTime.Date >= DateTime.Parse("08/13/2010").Date 
      select n; 
data.Dump("Result") ; 
1

Używam LinqDataSource i miałem problemy z uzyskaniem zapytania z porównaniem dat w nim, aby wykonać je bez błędów. Odpowiedzią jest użycie funkcji WhereAddParameters i dodanie wartości testowej jako silnie wpisanego parametru.

Zobacz przykład poniżej, gdzie dopasowuję groupid i sprawdzam, czy StopDate w moim rekordzie jest większy lub równy znacznikowi daty/czasu.

Obecnie używam tego fragmentu kodu i działa jak czar.

LinqCampaigns.WhereParameters.Add("StopDate", System.Data.DbType.Date, DateTime.Now.ToString()) 
LinqCampaigns.Where = "GroupId = " & myGrp & " && " & "StopDate >= @StopDate" 

Działa jak urok ....

1

użyć zmiennej lokalnej do przechowywania wartości daty, a następnie użyć tej zmiennej w zapytaniu:

DateTime today = DateTime.Now.Date; from scheme in context.schemes where scheme.EndDate > today select scheme

8

Można sprawdzić stan jak ten

var nextDay = DateTime.Today.AddDays(1); 

var query = from e in db.MyTable 
      where e.AsOfDate >= DateTime.Today && e.AsOfDate < nextDay 
      select e; 

tutaj dostaniesz zapisy na temat daty AsOfDate, gdy sprawdzamy dzisiaj (00:00:00) i jutro (00:00:00) otrzymamy dzisiejszą datę tylko co może być w tym czasie ...

0

.Date nie działało, ale dla mnie zrobił .Day.

var query = from o in Payments 
    where o.Order.OrderDate.Day != o.PaymentDate.Day 
    orderby o.Order.OrderDate 
    select new 
    { 
    o.Order.OrderID, 
    o.Order.OrderDate, 
    o.PaymentDate,  
    o.Order.FirstName, 
    o.Order.LastName, 
    o.Order.CustomerID 
    }; 


query.Dump(); 
+1

To prawdopodobnie nie jest *** *** To, co chcesz, po prostu dostanie Dzień Miesiąca. Tak więc, na przykład, 01 stycznia i 01 lutego oba mają tę samą wartość składnika "Dzień", mimo że faktycznie są różne dni w czasie rzeczywistym. – JoeBrockhaus

63

Użyj klasy DbFunctions do przycięcia części czasu.

using System.Data.Entity; 

var bla = (from log in context.Contacts 
      where DbFunctions.TruncateTime(log.ModifiedDate) 
           == DbFunctions.TruncateTime(today.Date) 
      select log).FirstOrDefault(); 

Źródło: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/84d4e18b-7545-419b-9826-53ff1a0e2a62/

+0

Czy walczyłeś z to, zdecydował się użyć metody rozszerzenia, aby dowiedzieć się później o tym -.- –

+6

To powinno być odpowiedzią –

+3

Funkcja EntityFunctions była przestarzała, zastąpiona przez funkcję DbFunction, zaktualizowana odpowiedź odzwierciedlająca ten –

0

zapewnić, aby sprawdzić wartość null tak:

'(from mm in _db.Calls 
    where mm.Professionnal.ID.Equals(proid) 
    && mm.ComposedDate.HasValue && 
    (mm.ComposedDate.Value >= datemin) && (mm.ComposedDate.Value <= date) 
    select mm).ToArray();' 
Powiązane problemy