2010-03-08 29 views
11

Tôi đang cố trả về một danh sách SimpleQuery truy vấn một bảng và sử dụng IN. tôi có thể có được điều này để làm việc sử dụngHiber Nhibernate nơi IN truy vấn

return new List<Jobs>(
    ActiveRecordMediator<Jobs>.FindAll(Expression.In("ServiceId", ids)) 
); 

Tuy nhiên điều này thực sự rất rất chậm. Vì vậy, id muốn làm điều gì đó như thế này

SimpleQuery<Job> query = 
    new SimpleQuery<Job>(@"from Job as j where ? in (j.ServiceId)", ids); 

return new List<Job>(query.Execute()); 

Tuy nhiên tôi không thể làm cho SimpleQuery hoạt động. Tôi không thể tìm thấy bất kỳ tài liệu nào đề cập đến điều này và hy vọng có ai đó ở đó sẽ có thể trợ giúp.

Cảm ơn

Trả lời

23

Hãy xem tài liệu Hiber NHQLnate here.

Tôi đoán từ mã của bạn, rằng bạn đang sau truy vấn HQL để trả về tất cả công việc có job.ServiceID trong danh sách các id.

Có lẽ một cái gì đó dọc theo dòng,

IQuery q = s.CreateQuery("from Job as j where j.ServiceId in (:serviceIds)"); 
q.SetParameterList("serviceIds", ids); 

BTW, bạn đã nghe nói về dự án NHibernate Lambda Extensions? Dưới đây là ví dụ về truy vấn IN được thực hiện bằng thư viện được đề cập. Có thể là một cái gì đó thú vị để xem xét như là một thay thế cho việc sử dụng HQL.

DetachedCriteria after = 
    DetachedCriteria.For<Person>() 
     .Add(SqlExpression.In<Person>(p => p.Name, 
      new string[] { "name1", "name2", "name3" })); 
+0

Cảm ơn bạn đã trả lời. tôi thay đổi nội dung truy vấn của tôi dựa trên trả lời của bạn SimpleQuery truy vấn = new SimpleQuery ( @ "từ công việc như j đâu j.SecondName = (: name) và ServiceId trong (: serviceIds)"); truy vấn.SetParameter ("serviceIds", id); truy vấn.SetParameter ("tên", tên); trả về Danh sách mới (truy vấn.Execute()); Vấn đề duy nhất bây giờ là mảng int của id tôi đang đi vào. Trường trong cơ sở dữ liệu là loại int, nếu tôi sử dụng IN trên bất kỳ trường chuỗi nào hoạt động tốt và nếu tôi vượt qua một giá trị int đơn nó hoạt động . Làm thế nào tôi có thể vượt qua một mảng? Cảm ơn – Gilbert

+2

Opps, gọi sai phương thức Hãy thử sử dụng q.SetParameterList thay vì – Noel

+0

Điều này cũng có thể hữu ích cho bạn cũng như http://www.nhforge.org/doc/nh/en/index.html#manipulatingdata-queryinterface – Noel

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