2013-04-07 7 views
16

Mit FNH, ich versuche Kategorien abzurufen, mit dem folgenden:LINQ Fluent NHibernate .Contains() funktioniert nicht in QueryOver <> funktioniert aber in Query <>

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

Aber ich erhalte eine Fehlermeldung an die .Contains() Methode:

Nicht erkannte Methodenaufruf: System.Collections.Generic.ICollection`1 [[System.Int64 mscorlib Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089]]: B oolean Enthält (Int64)

Warum bekomme ich diesen Fehler, was ist falsch?

Ich ging durch einige Beiträge, und änderte dann meine Abfrage in (unten), und dies funktioniert mit der Abfrage <>.

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

Ich dachte QueryOver <> ist die neueste und größte und sollte> anstelle von Abfrage < verwendet werden.

Was ist das Problem mit der Art, wie ich QueryOver <> wie oben gezeigt verwende?

+0

Ich denke, Sie müssen dies zuerst lesen http://stackoverflow.com/questions/5328565/nhibernate3-query-vs-queryover – frictionlesspulley

+0

Danke für den Link. Wie kann ich jedoch mit .Contains() dasselbe tun, wenn ich QueryOver <> verwende? – jaxxbo

+0

Ich mag diese Lösung besser: http://stackoverflow.com/questions/4739129/linq-to-nhibernate-where-collection-contains-object-with-id –

Antwort

21

Ich fand die Antwort. Dank der Post an: NHibernate using QueryOver with WHERE IN

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

Ich hatte das WhereRestrictionOn()

7

Dies ist tangential verwandtes Problem zu verwenden, und dies schien der beste Ort, um es zu setzen.

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

funktionierte nicht.

In meinem Fall someEnumerable war kein List<SomeType>, sondern ein HashSet<SomeType>. Anscheinend will NH wirklich, dass es eine Liste ist. Also habe ich das stattdessen gemacht und es hat funktioniert.

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

Auch FWIW, ich war unter dem Eindruck, dass Query<T> die neue bevorzugte Weg, was bedeutet, zu gehen war und dass QueryOver<T> war das weniger bevorzugte Art und Weise, weil Query<T> kehrt IQueryable, dass es ein wenig einfacher zu testen sein sollte, und theoretisch ORMs auslagern.

Verwandte Themen