Ho due query simili teoricamente ritornano gli stessi risultati:imprevisto Linq Behavior - ToList()
var requestNotWorking = SessionManagement.Db.Linq<Item>(false).Where(i =>
i.Group != null && i.Group.Id == methodParameter)
.ToList();
Questa richiesta restituisce 0 prodotti, anche se si deve restituire uno. Quanto segue è una riscrittura di quest'ultimo, ma con una chiamata al metodo ToList()
. Questa richiesta funziona e restituisce l'oggetto previsto nella prima query!
var requestWorking = SessionManagement.Db.Linq<Item>(false).ToList().Where(i =>
i.Group != null && i.Group.Id == methodParameter).ToList();
Nota: SessionManagement.Db.Linq<Item>(false)
è un generico LINQ to NHibernate metodo con l'attributo booleano che determina se la richiesta deve essere eseguito nella cache (true) o il database (false). In questo metodo non c'è nulla di sbagliato in quanto funziona normalmente in molte altre parti della soluzione. La mappatura dell'articolo non è niente di speciale: niente borse e i seguenti parametri: lazy="false" schema="dbo" mutable="false" polymorphism="explicit"
Perché è così?
Edit:
La richiesta SQL generato di requestNoWorking termina con:
(Item.Group_ID is not null) and [email protected]',N'@p0 int',@p0=11768
La richiesta SQL generato di requestWorking è circa un select * from dbo.Items
Se stai utilizzando SQL Server, hai provato a eseguire SQL Profiler mentre esegui entrambe queste query? – nerdybeardo
i.Group differisce tra i due. Identificato con nome, ma completamente diverso quando su diversi tipi di collezioni. –
Si prega di inviare l'SQL generato. C'è una differenza semantica tra ciò che l'SQL fa e ciò che detta la semantica C#. LINQ non promette la semantica identica. – usr