J'utilise d'abord Entity Framework Code. En utilisant LINQ to Entity, je veux récupérer un enregistrement basé sur une valeur DateTime. Voici mon code actuel:
/// <summary>
/// A method to check and see if the Parsed Game already exists on the
/// database. If Yes, then True is returned, otherwise False is returned.
/// </summary>
/// <param name="context">The Db Context to use</param>
/// <param name="homeTeam">The Name of the Home Team for the Game.</param>
/// <param name="awayTeam">The Name of the Away Team for the Game.</param>
/// <param name="date">The Date of the Game</param>
/// <returns></returns>
public bool doesGameAlreadyExist(PContext context, String homeTeam, String awayTeam, String date)
{
string dtObjFormat = "dd MMM yyyy";
DateTime dt;
DateTime.TryParseExact(date, dtObjFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt);
var result = context.Games.Where(x => EntityFunctions.TruncateTime(x.Start) == dt.Date).FirstOrDefault();
return result != null;
}
Le code ci-dessus renvoie l'erreur suivante:
LINQ to Entities does not recognize the method 'System.Nullable`1[System.DateTime] TruncateTime(System.Nullable`1[System.DateTime])' method, and this method cannot be translated into a store expression.
J'ai également essayé le code suivant et j'obtiens la même erreur:
var result = context.Games.Where(x => EntityFunctions.TruncateTime(x.Start) == EntityFunctions.TruncateTime(dt.Date)).FirstOrDefault();
Qu'est-ce que je fais mal?
J'ai récemment rencontré ce problème lorsque j'ai mis à niveau mon application Web d'Entity Framework 5 vers Entity Framework 6. Ensuite, j'ai réalisé que System.Data.Entity
DLL doit être complètement supprimé de l'application dans afin de fonctionner avec Entity Framework 6. Entity Framework 6 ne fait plus partie de .NET Framework et est donc indépendant de la DLL System.Data.Entity. Pour tronquer le temps, vous devez utiliser System.Data.Entity.DbFunctions.TruncateTime(...)
méthode de EntityFramework.dll. Oui, cela a résolu mon problème.
Bottom Line: Si vous utilisez Entity Framework 6, supprimez d'abord la référence System.Data.Entity
DLL puis, dans votre code, remplacez la fonction EntityFunctions.TruncateTime(..)
avec System.Data.Entity.DbFunctions.TruncateTime(...)
. [De EntityFramework.dll]
Je n'ai pas supprimé la référence System.Data.Entity
, Je viens de changer l'appel de DbFunctions.TruncateTime
à System.Data.Entity.DbFunctions.TruncateTime
et cela a fonctionné pour moi.
J'utilise Entity 6.