web-dev-qa-db-fra.com

Impossible de faire fonctionner EntityFunctions.TruncateTime ()

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?

28
J86

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]

66
Emran Hussain

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.

5
Tiago Ávila