Ho due metodi di estensione come questoLINQ to Entities non supporta il metodo di estensione?
public static IQueryable<T> CurrentVersion(this IQueryable<T> queryable, DateTime date)
{
return queryable.Where(p => p.CreationDate>date);
}
public static IEnumerable<T> CurrentVersion(this IEnumerable<T> queryable, DateTime date)
{
return queryable.Where(p => p.CreationDate>date);
}
Il mio modello è
public class Group {
..
ICollection<GroupMembers> GroupMembers { get; set; }
}
Quando uso dal metodo di estensione in questa query è tutto ok
var q = Db.Groups.CurrentVersion();
var result = q.ToList();
Ma quando lo uso nella query che scorre ottengo un errore
var q = Db.Groups.SelectMany(p => p.GroupMembers.AsQueryable().CurrentVersion(date));
OR
var q = Db.Groups.SelectMany(p => p.GroupMembers.AsEnumerable().CurrentVersion(date));
var result = q.ToList(); // Here I get error
Errore:
LINQ to Entities does not recognize the method 'System.Linq.IQueryable
1[..](System.Linq.IQueryable
1[..., System.DateTime)' method, and this method cannot be translated into a store expression.
Ora ho due domande:
I Googled questo errore e ha trovato lo stesso come la mia domanda a StackOverflow molti problemi. Tutte le risposte erano "Linq to Entities non può convertire questo metodo di estensione in una query SQL". Ora sarei grato se qualcuno mi aiutasse a sapere, perché la mia prima domanda non genera errori?
Come posso modificare il metodo di estensione che può essere riconosciuto da Linq-to-Entities?
Penso che la tua estensione non sia diversa con il mio metodo di estensione perché queryable.Where (ExpressionsHelper.CurrentVersion (date)) è uguale a queryable.Where (p => p.CreationDate> date); –
Indeed queryable.Where (ExpressionsHelper.CurrentVersion (date)) dovrebbe funzionare come queryable.Where (p => p.CreationDate> date); ma questo era l'obiettivo, giusto? Ho cambiato il tuo metodo in modo che la tua logica di filtraggio possa essere riutilizzata, come volevi. Quindi la differenza dovrebbe essere che il metodo proposto da me sta funzionando e EF può analizzarlo per interrogarlo. – mr100
Ma la mia versione del metodo di estensione CurrentVersion non può essere applicata alla query nidificata! Puoi usarlo solo con query semplici come Db.Groups.Versione attuale(); Per quelli complessi è necessario utilizzare Db.Groups.SelectMany (p => p.GroupMembers.AsQueryable(). Where (ExpressionsHelper.CurrentVersion (date))); Il metodo di estensione è presentato solo come esempio - se vuoi averlo, puoi averlo senza duplicazione del codice. – mr100