Ho istanziato un contesto e voglio scrivere una semplice query:
var result = db.Set.Where(x => x.Id == num).Select(whatever);
e non riesco a liberarmi del rosso trasandato in Where
lamentarsi di un'ambigua invocazione tra System.Collections.Generic.IEnumerable
e System.Linq.IQueryable.
System.Linq
è specificamente referenziato e System.Collections.Generic
non è referenziato in nessun punto del progetto. Come posso dire al codice che voglio usare System.Linq.IQueryable
?
Fatto. Alla gente non sembra piacere questa risposta, ma ha risolto il problema che ho descritto nella domanda.
db.Set.AsQueryable().Where(...
Questo problema è normalmente causato da un errore di inferenza del tipo nell'espressione fornita all'istruzione Where. Come è stato menzionato nei commenti sopra, il 100% è causato dall'operatore di assegnazione nel lambda che restituisce un int
invece di un bool
.
Per essere chiari, dove sei
var result = db.Set.Where(x => x.Id = num).Select(whatever);
Avresti dovuto
var result = db.Set.Where(x => x.Id == num).Select(whatever);
Un altro buon esempio (e più comune) di questo è qualcosa di simile
public class Elem
{
public bool IsSomething {get;set;}
public bool? IsSomethingElse {get;set;}
}
Quindi se fai la seguente domanda, che sembra molto ragionevole a prima vista, non riuscirà a compilare con l'errore piuttosto sconcertante di "invocazione abietta"
IQueryable<Elem> queryable = GetQueryable();
var result = queryable.Where(e => e.IsSomething && e.IsSomethingElse).ToList();
Se non stavi scrivendo questa affermazione all'interno di una lambda, avresti un errore più significativo di
"Impossibile applicare l'operatore '&&' agli operandi di tipo 'System.Nullable <bool>' e 'bool'"
Che ti direbbe immediatamente che non stai restituendo un booleano.