2009-08-04 6 views
14

J'écris ce code. Ici, dt est entré dans la fonction, ainsi que someint. La colonne Exp est une colonne de date T-SQL, qui se présente sous forme de DateTime via Linq.Comment ajouter un jour à jour dans Linq to SQL

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

En C#, vous pouvez ajouter un double en tant que jour à une date et heure. Ce qui signifie que vous pouvez ajouter 1,5 jours. Dans T-SQL, vous pouvez seulement ajouter 1 jour, puis 12 heures. Vous devez ajouter un int pour chaque partie. Ainsi, lorsque Linq convertit AddDays en T-SQL, il convertit mon nombre de jours en millisecondes et les ajoute. Cela lui permet de donner toute la précision que le double donne à C#.

Voici le frotter. Lorsque cela arrive à SQL, j'obtiens l'erreur:

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

Fondamentalement, vous ne pouvez pas ajouter de millisecondes à une date. Eh bien, je ne plaisante pas. Mais comment puis-je obtenir quelque chose qui se traduit ici? Je veux ajouter int jours à une date. Est-ce que le seul vouloir faire cela pour ajouter le négatif d'entre eux à l'autre gars avec qui je compare? Et si je voulais comparer aux colonnes tout en ajoutant à un?

Update 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.

S'il vous plaît noter que je suis en utilisant SQL Server 2008. Il est pas pris en charge sur le type de données DATE. Il est pris en charge sur datetime.

+0

Une commande comme datepart (millisecond, 10000, myDate) a été prise en charge dans T-SQL depuis au moins SQL Server 2000. Cette erreur suggère que la base de données que vous utilisez ne supporte pas la partie milliseconde, ce qui me semble étrange . – Keith

+0

Il n'est pas pris en charge sur le type de données DATE. Il est pris en charge sur datetime. –

+0

Cela a plus de sens. Eh bien, si vous avez le contrôle sur la conception DB, la solution simple serait de changer cette colonne d'un DATE à un DATETIME alors. Évidemment si vous posez cette question cependant, ce n'est pas quelque chose que vous contrôlez? – Keith

Répondre

4

Je viens de changer la colonne en un DateTime.

0

Avez-vous envisagé d'écrire votre propre fonction définie par l'utilisateur qui prend essentiellement un int (pour le nombre de jours) et la date, renvoie les résultats d'un dateadd()? Ensuite, insérez-le dans la classe LINQ de votre projet. Ensuite, au lieu d'appeler .AddDate(), appelez votre UDF - cela vous permettra de conserver tout dans votre requête LINQ sans avoir à assembler manuellement une SQLCommand.

6

Si vous utilisez Entity Framework, utilisez les System.Data.Objects.EntityFunctions comme ci-dessous:

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

Vous pouvez déplacer l'appel à AddDays de la partie SQL à la partie .NET:

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

Il semble que ce scénario est le plus souvent fixé à 4,5 .NET.

Cependant, si vous écrivez:

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

Vous obtiendrez le même message d'erreur comme décrit dans l'OP.

Mais, si vous écrivez:

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

Ensuite, vous pouvez entrer dans la terre du lait et du miel. Notez que je n'ai pas appelé .Date sur la représentation DateTime de la base de données. Cela semble être une couverture de test manquant de cas de bord par le cadre LINQ 2 SQL dans 4.5

+4

J'utilise .NET 4.5.1 et les deux scénarios que vous avez me donner l'erreur "non supporté par LINQ" – mgrenier

3

Créer un nouvel objet DateTime et utiliser la méthode AddDays après:

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

Peut être une bonne idée si vous devez d'abord changer votre requête Sql à LINQ et LINQ requête de processus à la place.

Il suffit d'ajouter ToList() ou limiter enregistrement

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

Donc une fois que vous avez tous vos trucs à Linq alors vous pouvez traiter plus effectivly je pense.

Vive

0

Vous pouvez utiliser: System.Data.Entity.DbFunctions.AddDays(YourDateTime, NumberOfDays) Cette fonction sera traduite valide la requête SQL. La classe System.Data.Entity.Core.Objects.EntityFunctions qui contient également la fonction AddDays est obsolète.

Questions connexes