2009-08-04 14 views
14

Sto scrivendo questo codice. Qui dt è inserito nella funzione, oltre che in qualche modo. La colonna Exp è una colonna di date T-SQL, che viene fornita come DateTime tramite Linq.Come aggiungere giorno fino alla data in Linq a SQL

return (from a in dataContext.TableOfA 
     where a.name == "Test" && 
     a.Exp.Value.AddDays(Convert.ToDouble(Someint)) >= new DateTimeOffset(dt) 
     select a).First(); 

In C#, è possibile aggiungere un doppio come un giorno a una data. Significa che puoi aggiungere 1,5 giorni. In T-SQL è possibile aggiungere solo 1 giorno, quindi 12 ore. È necessario aggiungere un valore int per ciascuna parte. Quindi, quando Linq traduce AddDays in T-SQL, converte il mio numero di giorni in millisecondi e li aggiunge. Questo gli permette di dare tutta la precisione che il doppio dà a C#.

Ecco il problema. Quando si arriva a SQL, viene visualizzato l'errore:

The datepart millisecond is not supported by date function dateadd for data type date

Fondamentalmente non è possibile aggiungere millisecondi ad una data. Beh no scherzo. Ma come faccio a ottenere qualcosa che si traduce qui? Voglio aggiungere int giorni a una data. La sola vuole fare questo per aggiungere il loro negativo all'altro con cui sto confrontando? Cosa succede se volevo confrontare le colonne aggiungendole a una?

Aggiornamento 1

Keith wrote, A command like datepart(millisecond, 10000, myDate) has been supported in T-SQL since at least SQL Server 2000. This error suggests that whatever database you are using does not support the millisecond date part, which seems strange to me.

Si prega di notare che sto usando SQL Server 2008. Non è supportato dal tipo di dati DATE. È supportato su datetime.

+0

Un comando come datepart (millisecondo, 10000, myDate) è stato supportato in T-SQL almeno da SQL Server 2000. Questo errore suggerisce che qualsiasi database in uso non supporta la parte della data in millisecondi, il che mi sembra strano . – Keith

+0

Non è supportato nel tipo di dati DATE. È supportato su datetime. –

+0

Questo ha più senso. Bene, se si ha il controllo sulla progettazione del DB, la soluzione semplice sarebbe quella di cambiare questa colonna da un DATE a un DATETIME quindi. Ovviamente, se stai facendo questa domanda, questo non è qualcosa su cui hai il controllo? – Keith

risposta

4

Ho appena cambiato la colonna in un DateTime.

0

Hai mai pensato di scrivere la tua funzione definita dall'utente che contiene in pratica un int (per numero di giorni) e una data, restituisce i risultati di un dateadd()? Quindi inseriscila nella classe LINQ del tuo progetto. Quindi, anziché chiamare .AddDate(), chiama l'UDF: ciò ti consentirà di mantenere tutto nella query LINQ senza dover assemblare manualmente un SQLCommand.

2

È inoltre possibile utilizzare SqlMethods.DateDiffDay metodo, se si sta cercando di confrontare due date

6

Se si utilizza Entity Framework, utilizzare i System.Data.Objects.EntityFunctions come di seguito:

c.CMT_TS > System.Data.Objects.EntityFunctions.AddDays(e.Call.CALL_TS, 1) 
3

è possibile spostare la chiamata al AddDays dalla parte SQL per la parte di .NET:

a.Exp.Value >= new DateTimeOffset(dt).AddDays(-Convert.ToDouble(Someint)) 
4

sembra che questo scenario è in gran parte risolto in .NET 4.5.

Tuttavia, se si scrive:

var activeProducts = from p in db.Products where DateTime.Now() <= p.EndDate.Date.AddDays(7) select p; 

si otterrà lo stesso messaggio di errore come descritto nel PO.

Ma, se si scrive:

var activeProducts = from p in db.Products where DateTime.Now() <= p.EndDate.AddDays(7) select p; 

Quindi è possibile entrare nella terra di latte e miele. Si noti che non ho chiamato .Data sulla rappresentazione DateTime del database. Questo sembra essere un caso limite con copertura del test mancante dal framework SQL LINQ 2 in 4.5

+4

Sto usando .NET 4.5.1 ed entrambi gli scenari mi danno l'errore "non supportato da LINQ" – mgrenier

3

Creare un nuovo DateTime oggetto e utilizzare il metodo AddDays dopo che:

new DateTime(t.Key.Year,t.Key.Month,T.Key.Day).AddDays(xx) 
-2

Può essere una buona idea se si dovrebbe prima modificare la tua ricerca SQL per Linq e processo di query LINQ, invece.

Basta aggiungere ToList() o limitare registrare

return (from a in dataContext.TableOfA.ToList() 
    where a.name == "Test" && 
    a.Exp.Value.AddDays(Convert.ToDouble(Someint)) >= new DateTimeOffset(dt) 
    select a).First(); 

Quindi una volta che avete tutte le tue cose in Linq allora si può elaborare più effectivly credo.

Acclamazioni

0

È possibile utilizzare: System.Data.Entity.DbFunctions.AddDays(YourDateTime, NumberOfDays) Questa funzione sarà tradotto al valida query SQL. La classe System.Data.Entity.Core.Objects.EntityFunctions che contiene anche la funzione AddDays è obsoleta.

Problemi correlati