23

Sto utilizzando il codice di Entity Framework First. Usando LINQ su Entity voglio prendere un record basato su un valore DateTime. Qui è il mio codice corrente:Impossibile ottenere EntityFunctions.TruncateTime() per funzionare

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

} 

Il codice sopra tiri il seguente errore:

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. 

Ho anche provato il seguente codice ed ottengo lo stesso errore:

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

Cosa sto sbagliando?

+0

Molto strano. Sembra quasi che tu abbia un altro 'EntityFunctions 'di classe statica. Cosa succede se si preme F12 su "EntityFunctions"? Atterri nello spazio dei nomi 'System.Data.Entity.dll' e' System.Data.Objects'? – Slauma

+0

Ho lo stesso problema - utilizzando la versione alpha di EF6 –

risposta

54

Ho affrontato questo problema di recente quando ho aggiornato la mia applicazione Web da Entity Framework 5 a Entity Framework 6. Quindi, mi sono reso conto che la DLL System.Data.Entity deve essere completamente rimossa dall'applicazione per poter funzionare con Entity Framework 6. Entity Framework 6 non fa più parte di .NET Framework e quindi è indipendente dalla dll System.Data.Entity. Per troncare il tempo, è necessario utilizzare il metodo System.Data.Entity.DbFunctions.TruncateTime(...) da EntityFramework.dll. Sì, questo ha risolto il mio problema.

Bottom Line: Se si utilizza Entity Framework 6, prima rimuovere la DLL di riferimento System.Data.Entity e poi, nel codice, sostituire EntityFunctions.TruncateTime(..) con System.Data.Entity.DbFunctions.TruncateTime(...). [Da EntityFramework.dll]

+3

Se si sta già utilizzando 'EntityFunctions', probabilmente si sta importando lo spazio dei nomi System.Data.Entity. Pertanto, la rimozione del riferimento all'assembly v4.0 System.Data.Entity e la sostituzione di 'EntityFunctions' con' DbFunctions' nel codice dovrebbero funzionare per la maggior parte delle persone. – pseudocoder

+0

Se vuoi mettere .Include() .. ho ancora bisogno di System.Data.Entity. Include include in EntityFramework.dll versione 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(); 

Per ottenere i risultati della data tramite query Linq utilizzare questa funzione.

3

Non ho rimosso il riferimento System.Data.Entity, ho appena cambiato la chiamata da DbFunctions.TruncateTime a System.Data.Entity.DbFunctions.TruncateTime e ha funzionato per me.

Sto utilizzando Entity 6.

+0

Questa dovrebbe essere la risposta corretta! – Nour

+0

Grazie a @Nour. Sono felice per l'aiuto! –

+0

è la stessa cosa – Jackstine

Problemi correlati