2009-04-22 28 views

Trả lời

1

Bạn không thể đạt được NHibernate trả về cho bạn một IList? Giao diện ICriteria định nghĩa một phương pháp List<T> ...

+0

Có bạn có thể! Chỉ cần sử dụng var result = Session.CreateCriteria (....) Danh sách () thay vì og .List(). – stiank81

+0

@ stiank81: đó là một câu hỏi mang tính lịch sử. ;) –

+0

Vâng - Tôi hiểu rằng ;-) Chỉ cần thêm một bình luận với các chi tiết cùng với +1 của tôi trong niềm vui sau khi chỉ học điều này từ bạn .. – stiank81

72

Nếu bạn chắc chắn rằng tất cả các yếu tố kế thừa từ T (hoặc bất kỳ loại mà bạn đang sử dụng)

IList<T> myList = nonGenericList.Cast<T>().ToList(); 

Nếu bạn không chắc chắn :

IList<T> myList = nonGenericList.OfType<T>().ToList(); 

Tất nhiên, bạn sẽ cần không gian tên System.Linq:

using System.Linq; 
2

Một cách là sử dụng LINQ, như list.OfType<T>() hoặc .Cast<T>()

5

CastOfType trở IEnumerable<T> implemetnations, không IList<T> triển khai, vì vậy họ sẽ không có ích cho bạn.

Gọi. Cast<T>().ToList sẽ dẫn đến một bản sao bổ sung của danh sách, có thể có tác động bất lợi về hiệu suất.

Cách tiếp cận tốt hơn (IMHO) sẽ chỉ là tạo lớp bao bọc và thực hiện chuyển đổi khi đang di chuyển. Bạn muốn một cái gì đó như thế này:

class ListWrapper<T> : IList<T> 
{ 
    private IList m_wrapped; 

    //implement all the IList<T> methods ontop of m_wrapped, doing casts 
    //or throwing not supported exceptions where appropriate. 
    //You can implement 'GetEnumerator()' using iterators. See the docs for 
    //yield return for details 
} 

Điều đó sẽ có lợi thế là không tạo bản sao khác của toàn bộ danh sách.

1

Frederik là chính xác, NHibernate đã thực hiện việc này.

var data = query.List<MyType>(); 

Điều này sẽ dẫn đến ILIST loại bạn đã chỉ định. Trong trường hợp này là IList<MyType>.

3

Fredrick là chính xác. Nhưng Nhibernate cũng có một tùy chọn để trả lại nhiều tập kết quả. Ví dụ:

IList multiResults = session.CreateMultiCriteria() 
       .Add(pageCriteria) 
       .Add(countCriteria) 
       .List(); 

Trong cuộc gọi ở trên không có tùy chọn trả lại danh sách đã nhập. Vì vậy, nó phải được đúc như đã đề cập ở trên, như thế này:

IList<T> results = ((IList)multiResults[0]).Cast<T>().ToList(); 
      IList counts = (IList)multiResults[1]; 
Các vấn đề liên quan