2011-08-16 8 views
47

próbuję wykonać następujący kod i otrzymuję błąd"Data" nie jest obsługiwana w LINQ do jednostek. Tylko inicjalizatory, członkowie jednostki, a jednostka nawigacji właściwości są obsługiwane

public List<Log> GetLoggingData(DateTime LogDate, string title) 
{ 
    var context = new LoggingEntities(); 
    var query = from t in context.Logs 

      where t.Title == title 
      && t.Timestamp == LogDate 

      select t; 
    return query.ToList(); 
} 

Błąd Otrzymuję jest „Określony element typu«data»jest nie jest obsługiwane w LINQ do jednostek. Obsługiwane są tylko inicjalizatory, elementy encji i właściwości nawigacji jednostki. " Próbowałem różnych prób rzucania każdego elementu na ciąg, porównując tylko część z datą, ale nie można uzyskać odpowiedniej kombinacji. Każda pomoc jest bardzo doceniana.

+1

Pokaż nam klasę Logi tabeli to jest mapowany. – BennyM

+0

Używam EFv1 z .net 3.5. Klasa dziennika jest po prostu tabelą dziennika z biblioteki przedsiębiorstwa z tytułem jako typ ciągu i datownikiem jako polem daty i godziny.Chcę tylko porównać datepart – mikemurf22

Odpowiedz

23

Nie jest to najlepsze rozwiązanie, ale działa. Z wielu powodów muszę użyć .net 3.5 w tym momencie i modyfikacja bazy danych byłaby trudna. Tak czy inaczej, oto rozwiązanie, które działa:

  var query = from t in context.Logs 
         where t.Title == title 
         && t.Timestamp.Day == LogDate.Day 
         && t.Timestamp.Month == LogDate.Month 
         && t.Timestamp.Year == LogDate.Year 
         select t; 

Nie jest to najbardziej eleganckie rozwiązanie, ale jest skuteczne.

+0

Określony element typu "Data" nie jest obsługiwany w LINQ do jednostek. Obsługiwane są tylko inicjatory, elementy encji i właściwości nawigacji jednostki. – SAR

1

Popraw mnie, jeśli się mylę, ale w przykładzie mikemurf22, należałoby sprawdzić każdą część komponentu daty i potencjalnie znacznie więcej przetwarzania serwera?

W każdym razie natknąłem się na ten problem i to jest moje rozwiązanie.

Zakładając, że będziesz przechodzić tylko w składniku daty, możesz znaleźć ostatnią chwilę dnia, w którym się podajesz, i użyć klauzuli where, aby zdefiniować zakres.

public List<Log> GetLoggingData(DateTime LogDate, string title) 
{ 
    DateTime enddate = new DateTime(LogDate.Year, LogDate.Month, LogDate.Day, 23, 59, 59) 

    var query = from t in context.Logs 
       where t.Timestamp >= date 
       where t.Timestamp <= enddate 
       select t; 

    return query.ToList(); 
} 
-1

Można użyć tej Hack:

DateTime startDate = LogDate.Date; 
DateTime endDate = LogDate.Date.AddDays(1); 

var query = from t in context.Logs 
      where t.Title == title 
        && t.Timestamp >= startDate 
        && t.Timestamp < endDate 
      select t; 
+0

Poprawiłem trochę. Z cource nie można użyć metody AddDays w zapytaniu. Ale możesz go przenieść na zewnątrz. W związku z tym obejście nadal działa. – algreat

83

Jeśli używasz EF 6.0+, można użyć DbFunctions.TruncateTime(DateTime?):

var query = 
    from t in context.Logs 
    where t.Title == title 
    && DbFunctions.TruncateTime(t.Timestamp) == LogDate.Date 
    select t; 

Uwaga: W przypadku wcześniejszej wersji EF gdzie DbFunctions jest niedostępny, można zamiast tego użyć EntityFunctions.TruncateTime(DateTime?).

+0

Będziesz także musiał skrócić własność LogDate.Date – invalidusername

+1

@invalidusername LogDate to DateTime, co oznacza, że ​​LogDate.Date jest "obcięty" –

+3

+1 dla Ciebie. Nie mogłem użyć zaakceptowanej odpowiedzi w moim przypadku, ponieważ dokonałem porównania "większego niż", w którym nie można porównywać w Dniu, Miesiącie i Roku osobno. –

2

Zawsze używaj EntityFunctions.TruncateTime() dla X.DateTimeStart i LogDate. takich jak:

var query = from t in context.Logs 
       where t.Title == title 
       && EntityFunctions.TruncateTime(t.Timestamp) == EntityFunctions.TruncateTime(LogDate) 
       select t; 
0

Konwersja longDate do .ToShortDateString i wtedy można go używać w ten sposób:

EntityFunctions.TruncateTime(t.Timestamp) == LogDate 

jak Mike nie

0

Spróbuj tego:

var calDate = DateTime.Now.Date.AddDays(-90); 

var result = return (from r in xyz where DbFunctions.TruncateTime(r.savedDate) >= DbFunctions.TruncateTime(calDate) 
Powiązane problemy