2013-04-07 23 views
16

Korzystanie FNH, próbuję odzyskać kategorie, stosując następujący:LINQ Fluent NHibernate .Contains() nie działa w QueryOver <> ale działa w Query <>

_session.QueryOver<Data.Model.Category>() 
            .Where(c => tourCreateRequest.Categories.Contains(c.CategoryId)) 
            .List() 
            .Select(_categoryMapper.CreateCategory) 
            .ToList(); 

Ale pojawia się błąd przy z .Contains() metoda:

nierozpoznany wywołanie metody: System.Collections.Generic.ICollection`1 [[System.Int64, mscorlib, Version = 4.0.0.0 Kultura = neutralne TokenKluczaPublicznego = b77a5c561934e089]]: B oolean Zawiera (Int64)

Dlaczego otrzymuję ten błąd, co jest nie tak?

Przeszedłem kilka postów, a następnie zmieniono moje zapytanie na (poniżej), a to działa z zapytaniem <>.

_session.Query<Data.Model.Category>() 
            .Where(c => tourCreateRequest.Categories.Contains(c.CategoryId)) 
            .ToList() 
            .Select(_categoryMapper.CreateCategory) 
            .ToList(); 

Myślałem QueryOver <> to najnowszy i największy i powinien być stosowany zamiast Query <>.

Na czym polega problem ze sposobem, w jaki korzystam z QueryOver <> jak pokazano powyżej?

+0

Myślę, że musisz przeczytać ten pierwszy http://stackoverflow.com/questions/5328565/nhibernate3-query-vs-queryover – frictionlesspulley

+0

Dzięki za link. Jak jednak wykonać to samo przy użyciu funkcji .Contains() przy użyciu QueryOver <>? – jaxxbo

+0

Lepsze to rozwiązanie: http://stackoverflow.com/questions/4739129/linq-to-nhibernate-where-collection-contains-object-with-id –

Odpowiedz

21

Znalazłem odpowiedź. Dzięki posta pod adresem: NHibernate using QueryOver with WHERE IN

var categories = _session.QueryOver<Data.Model.Category>() 
            .WhereRestrictionOn(c => c.CategoryId).IsIn(ArrayofCategoryIds) 
            .List() 
            .Select(_categoryMapper.CreateCategory) 
            .ToList(); 

musiałem użyć WhereRestrictionOn()

7

Jest to problem związany stycznie, a to wydawało się, że najlepsze miejsce, aby umieścić go.

_session.Query<SomeType>.Where(t => someEnumerable.Contains(t)) 

nie działał.

W moim przypadku someEnumerable NIE był numerem List<SomeType>, ale raczej HashSet<SomeType>. Wygląda na to, że NH naprawdę chce, żeby to była lista. Więc zrobiłem to zamiast tego i zadziałało.

var someEnumerableList = someEnumerable.ToList(); 
_session.Query<SomeType>.Where(t => someEnumerableList.Contains(t) 

Również FWIW, byłem pod wrażeniem, że Query<T> była nowa preferowana droga i że QueryOver<T> był mniej korzystny sposób, ponieważ Query<T> zwrotów IQueryable, co oznacza, że ​​powinna ona być nieco łatwiejsze do sprawdzenia, i teoretycznie zamień ORM.

Powiązane problemy