Mam dwa podobne zapytania powracających teoretycznie takie same wyniki:Nieoczekiwany LINQ Zachowanie - ToList()
var requestNotWorking = SessionManagement.Db.Linq<Item>(false).Where(i =>
i.Group != null && i.Group.Id == methodParameter)
.ToList();
To żądanie zwraca 0 pozycji, mimo że ma powrócić jeden. Poniżej znajduje się przeróbka tego ostatniego, ale z wywołaniem metody ToList()
. To żądanie działa i zwraca element oczekiwany w pierwszym zapytaniu!
var requestWorking = SessionManagement.Db.Linq<Item>(false).ToList().Where(i =>
i.Group != null && i.Group.Id == methodParameter).ToList();
Uwaga: SessionManagement.Db.Linq<Item>(false)
to ogólna metoda LINQ do NHibernate z atrybut Boolean określające, czy wniosek musi być wykonywane w pamięci podręcznej (prawda) lub bazy danych (fałsz). Podobno w tej metodzie nie ma nic złego, ponieważ działa on normalnie w wielu innych częściach rozwiązania. Mapowanie elementu nie jest niczym wyjątkowym: brak torebek i następujących parametrów: lazy="false" schema="dbo" mutable="false" polymorphism="explicit"
Dlaczego tak się dzieje?
Edit:
Wygenerowany zapytanie SQL requestNoWorking kończy:
(Item.Group_ID is not null) and [email protected]',N'@p0 int',@p0=11768
Wygenerowany zapytanie SQL requestWorking jest grubsza select * from dbo.Items
Jeśli używasz serwera Sql, czy próbowałeś uruchomić program SQL Profiler podczas uruchamiania obu tych zapytań? – nerdybeardo
i.Group różni się między tymi dwoma. Identycznie nazwane, ale różne w ogóle w przypadku różnych typów kolekcji. –
Proszę napisać wygenerowany SQL. Istnieje różnica semantyczna między tym, co robi SQL, a tym, co dyktuje semantyka C#. LINQ nie obiecywa identycznej semantyki. – usr