23

Używam Entity Framework Code First. Używanie LINQ do Entity Chcę pobrać rekord na podstawie wartości DateTime. Tu jest mój bieżący kod:Nie można uzyskać EntityFunctions.TruncateTime() do pracy

/// <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; 

} 

Powyższy kod wyrzuca następujący błąd:

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. 

Próbowałem też poniższy kod i uzyskać ten sam błąd:

var result = context.Games.Where(x => EntityFunctions.TruncateTime(x.Start) == EntityFunctions.TruncateTime(dt.Date)).FirstOrDefault(); 

Co czy robię źle?

+0

Bardzo dziwne. Wygląda to niemal tak, jakbyś miał gdzieś inną klasę statyczną "EntityFunctions". Co jeśli trafisz F12 na "EntityFunctions"? Czy lądujesz w przestrzeni nazw 'System.Data.Entity.dll' i' System.Data.Objects'? – Slauma

+0

Mam ten sam problem - używanie wersji alfa EF6 –

Odpowiedz

54

Ostatnio napotkałem ten problem, gdy uaktualniłem moją aplikację internetową z Entity Framework 5 do Entity Framework 6. Następnie zdałem sobie sprawę, że należy całkowicie usunąć bibliotekę DLL z System.Data.Entity, aby móc pracować z Entity Framework 6. Entity Framework 6 nie jest już częścią .NET Framework i dlatego jest niezależny od biblioteki System.Data.Entity. Aby skrócić czas, musisz użyć metody System.Data.Entity.DbFunctions.TruncateTime(...) z EntityFramework.dll. Tak, to rozwiązało mój problem.

Bottom Line: Jeśli używasz Entity Framework 6, najpierw usunąć odniesienie System.Data.Entity DLL, a następnie w kodzie, wymienić EntityFunctions.TruncateTime(..) z System.Data.Entity.DbFunctions.TruncateTime(...). [From EntityFramework.dll]

+3

Jeśli już używasz 'EntityFunctions', prawdopodobnie importujesz przestrzeń nazw System.Data.Entity. Zatem samo usunięcie odwołania do zestawu System.Data.Entity v4.0 i zastąpienie 'EntityFunctions' przez' DbFunctions' w kodzie powinno działać dla większości ludzi. – pseudocoder

+0

Jeśli chcesz umieścić .Include() .. nadal potrzebuję System.Data.Entity. Czy funkcja Include istnieje w EntityFramework.dll w wersji 6+? –

0
DateTime? dt = DateTime.Parse(sText); 
campaigns = _CampaignMasterRepository.Get().OrderByDescending(a => a.LaunchOn).Where(a => a.UserId == obj_User.ID && a.CampaignStatus == (int)OmevoEnums.CampaignStatus.Sent && a.CampaignName.Contains(sText) || DbFunctions.TruncateTime(a.LaunchOn) == DbFunctions.TruncateTime(dt)).ToList(); 

Aby uzyskać wyniki daty za pomocą zapytań Linq, użyj tej funkcji.

3

Nie usunąłem odnośnika System.Data.Entity, właśnie zmieniłem połączenie z DbFunctions.TruncateTime na System.Data.Entity.DbFunctions.TruncateTime i zadziałało dla mnie.

Używam Entity 6.

+0

To powinna być poprawna odpowiedź! – Nour

+0

Dzięki @Nour. Cieszę się z pomocy! –

+0

to to samo – Jackstine