2013-04-07 23 views
16

Sử dụng FNH, tôi đang cố gắng để lấy loại, sử dụng như sau:LINQ thành thạo NHibernate Chứa() không hoạt động trong QueryOver <> nhưng làm việc trong Query <>

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

Nhưng tôi nhận được một lỗi tại các Chứa() phương pháp:

Không nhận dạng được gọi phương thức: System.Collections.Generic.ICollection`1 [[System.Int64, mscorlib, Version = 4.0.0.0, Culture = trung tính, PublicKeyToken = b77a5c561934e089]]: B oolean Contains (Int64)

Tại sao tôi nhận được lỗi đó, có gì sai?

Tôi đã xem qua một số bài đăng và sau đó thay đổi truy vấn của tôi thành (bên dưới) và điều này hoạt động với Truy vấn <>.

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

Tôi nghĩ QueryOver <> là mới nhất và vĩ đại nhất và nên được sử dụng thay vì truy vấn <>.

Vấn đề với cách tôi đang sử dụng QueryOver <> như được hiển thị ở trên là gì?

+0

Tôi nghĩ bạn cần phải đọc http://stackoverflow.com/questions/5328565/nhibernate3-query-vs-queryover – frictionlesspulley

+0

đầu tiên này nhờ liên kết. Tuy nhiên, làm thế nào tôi có thể thực hiện điều tương tự bằng cách sử dụng .Contains() sử dụng QueryOver <>? – jaxxbo

+0

Tôi thích giải pháp này tốt hơn: http://stackoverflow.com/questions/4739129/linq-to-nhibernate-where-collection-contains-object-with-id –

Trả lời

21

Tôi đã tìm thấy câu trả lời. Nhờ bài đăng tại: NHibernate using QueryOver with WHERE IN

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

tôi đã phải sử dụng WhereRestrictionOn()

7

Đây là vấn đề tiếp tuyến có liên quan và điều này dường như là nơi tốt nhất để đặt nó.

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

không hoạt động.

Trong trường hợp của tôi someEnumerable KHÔNG phải là List<SomeType>, mà là HashSet<SomeType>. Rõ ràng, NH thực sự muốn nó là một danh sách. Vì vậy, tôi đã làm điều này thay vào đó và nó đã làm việc.

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

Ngoài ra, FWIW, tôi đã có ấn tượng rằng Query<T> là cách mới ưa thích để đi và rằng QueryOver<T> là cách ít được ưu tiên, vì Query<T> lợi nhuận IQueryable, có nghĩa là nó phải là một chút dễ dàng hơn để kiểm tra, và trao đổi về mặt lý thuyết các ORM.

Các vấn đề liên quan