2011-08-16 8 views
47

Sto cercando di eseguire il seguente codice e sto ricevendo un errore'Data' non è supportato in LINQ alle entità. Solo inizializzatori, i membri di entità, e le proprietà di navigazione entità sono supportate

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(); 
} 

L'errore che sto ricevendo è "il membro tipo specificato 'Data' è non supportato in LINQ alle entità. Sono supportati solo gli inizializzatori, i membri dell'entità e le proprietà di navigazione delle entità. " Ho provato vari tentativi di trasmettere tutto ad una stringa, confrontando solo la parte della data, ma non riesco a ottenere la giusta combinazione. Qualsiasi aiuto è molto apprezzato.

+1

Mostraci la classe dei registri e la tavola è essere mappato. – BennyM

+0

Sto usando EFv1 con .net 3.5. La classe di registro è solo una tabella di registro dalla libreria aziendale con il titolo come tipo String e Timestamp come campo datetime.Voglio solo confrontare la datapart – mikemurf22

risposta

23

Non è la soluzione migliore, ma funziona. Per una serie di motivi, a questo punto devo usare. 3.5 e modificare il database sarebbe difficile. Ad ogni modo, ecco una soluzione che funziona:

  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; 

Non è la soluzione più elegante, ma è efficace.

+0

Il membro del tipo specificato 'Data' non è supportato in LINQ alle entità. Sono supportati solo gli inizializzatori, i membri dell'entità e le proprietà di navigazione delle entità. – SAR

1

Correggetemi se ho torto, ma nell'esempio di mikemurf22, sarebbe necessario controllare ciascuna parte del componente data e potenzialmente molto più l'elaborazione del server?

In ogni caso, mi sono imbattuto in questo problema, e questa è la mia soluzione.

Supponendo che si stia passando solo il componente della data, è possibile trovare l'ultimo minuto del giorno in cui si passa e utilizzare la clausola where per definire l'intervallo.

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

È possibile utilizzare questo 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

L'ho corretto un po '. Di cortesia non è possibile utilizzare il metodo AddDays all'interno della query. Ma puoi spostarlo all'esterno. Quindi la soluzione funziona ancora. – algreat

83

Se si utilizza EF 6.0 e versioni successive, è possibile utilizzare DbFunctions.TruncateTime(DateTime?):

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

Nota: Per la versione precedente di EF, dove DbFunctions non disponibile, è possibile utilizzare EntityFunctions.TruncateTime(DateTime?).

+0

Devi anche troncare la proprietà LogDate.Date – invalidusername

+1

@invalidusername LogDate è un DateTime che significa che LogDate.Date è "troncato" –

+3

+1 per te signore. Non ho potuto utilizzare la risposta accettata nel mio caso perché ho fatto un confronto "maggiore di", in cui non è possibile confrontare separatamente giorno, mese e anno. –

2

Utilizzare sempre EntityFunctions.TruncateTime() per x.DateTimeStart e LogDate. come ad esempio:

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

Converti longdate a .ToShortDateString e quindi è possibile utilizzare in questo modo:

EntityFunctions.TruncateTime(t.Timestamp) == LogDate 

come Mike ha

0

Prova questa:

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

var result = return (from r in xyz where DbFunctions.TruncateTime(r.savedDate) >= DbFunctions.TruncateTime(calDate) 
Problemi correlati