Sự khác nhau giữa danh sách, bộ và túi trong tệp ánh xạ NHibernate là gì? Mỗi bộ phận liên quan đến bộ sưu tập .NET như thế nào?Danh sách vs Bộ vs Túi trong NHibernate
Trả lời
NHibernate ngữ nghĩa:
Danh sách: Đã đặt hàng bộ sưu tập của các đối tượng, trùng lặp cho phép. Sử dụng mã .NET
IList
. Cột chỉ mục sẽ cần phải được ánh xạ trong NHibernate.Đặt: Bộ sưu tập không theo thứ tự các thực thể duy nhất, các bản sao không được phép. Sử dụng
Iesi.Collection.ISet
trong mã (NH trước v4) hoặcSystem.Collections.Generic.ISet
(NH v4 +). Điều quan trọng là ghi đèGetHashCode
vàEquals
để chỉ định định nghĩa doanh nghiệp trùng lặp. Có thể được sắp xếp bằng cách xác định một orderby hoặc bằng cách xác định một so sánh dẫn đến một kết quảSortedSet
.Túi: Danh sách các thực thể không theo thứ tự, các bản sao được phép. Sử dụng mã .NET
ICollection<T>
. Cột chỉ mục của danh sách không được ánh xạ và không được NHibernate vinh danh.
Sự khác biệt chính là danh sách có thứ tự ngầm định cho các phần tử, được lập chỉ mục theo vị trí của chúng trong danh sách. Các bộ và túi cũng có thể được "đặt hàng" thường bằng một Bộ so sánh hoặc một đơn hàng theo mệnh đề được áp dụng khi các mục đó ra khỏi DB. Cá nhân, tôi đã không bao giờ sử dụng Túi ... nếu tôi biết dữ liệu tôi muốn được đặt hàng tuần tự tôi sử dụng Danh sách nếu không tôi sử dụng Set.
Đặt không cho phép bạn có các thành phần lặp lại trong đó. Nếu bạn sẽ cố gắng thêm một số phần tử mới, nó sẽ so sánh (phương thức Equals được sử dụng) mỗi phần tử đã có trong bộ sưu tập với phần bạn thêm vào, và nếu một phần tử retuns đúng, sẽ không được thêm
Tất cả các đối tượng này trong NHibernate là chính xác giống như các triển khai khác của các kiểu dữ liệu trừu tượng này (ADT). Tôi đã rất ngạc nhiên khi thấy Bộ và Túi trực tuyến khó khăn như thế nào vì những cái tên phổ biến cho những thứ khác, vì vậy tôi đã liệt kê một số liên kết và mô tả ở đây.
Để biết thông tin chi tiết hơn hãy xem ví dụ sau: Lists, Sets và Bags
Các quy tắc chung là:
Lists theo mặc định đặt hàng, sử dụng những nếu bạn muốn có thể kéo ra một đối tượng bằng chỉ mục của nó hoặc bạn có một kỳ lạ của vòng for
trên foreach
vòng lặp. Bạn không cần phải truy cập chúng theo thứ tự như bạn sẽ cần đến trong một Linked List. ADT này cho phép trùng lặp.
Xin lưu ý! Mặc dù danh sách được sắp xếp như BryanD được đề cập trong câu trả lời của mình, hoàn toàn không có gì nói rằng nó phải theo thứ tự bạn mong đợi từ cơ sở dữ liệu khi bạn thực hiện truy vấn HQL trừ khi bạn chỉ định thứ tự theo lệnh. Đó là bởi vì điều này mà một số người thích sử dụng Set hoặc Túi thay vào đó, để nó không cung cấp cho các ảo tưởng được lệnh. Mặc dù tôi nói điều này, hầu hết thời gian họ sẽ xuất hiện để được theo thứ tự hiển thị, vì chúng được thêm vào danh sách theo thứ tự mà chúng được tìm thấy trong truy vấn NHibernate chạy.
Đặt là không theo mặc định, bạn không thể truy cập bất kỳ biến nào trực tiếp thông qua chỉ mục. Các bộ theo mặc định là chỉ ADT trong số ba trường hợp trên duy trì tính duy nhất của đối tượng. Đây là những điều tuyệt vời nếu bạn có một bộ sưu tập nếu bạn yêu cầu không chứa các bản sao.
Túi (hoặc Multisets), như bạn có thể nhìn thấy từ các liên kết trên, một loại Set mà không cho phép các đối tượng bên trong nó là bản sao của đối tượng khác. Đây không phải là thường được sử dụng, như đặt hàng danh sách có thể được bỏ qua, và do đó được coi là một túi.
Liên quan đến cách chúng được sử dụng trong NHibernate, không có gì được lấy từ cơ sở dữ liệu khác nhau tùy thuộc vào ADT bạn chọn ở đây, đó là những gì bạn muốn sử dụng nó để làm cho bạn chọn ADT khác nhau.
Cá nhân, tôi sử dụng Bộ cho hầu hết mọi thứ vì tôi thường yêu cầu các đối tượng con là duy nhất và thứ tự không phải là vấn đề.Mặc dù tôi sẽ sử dụng Danh sách nơi tôi có một nhóm đối tượng mà tôi muốn đặt hàng bởi một cái gì đó, ví dụ thời gian, để đạt được thứ tự này, tôi cần phải tự đặt "thứ tự theo" trong truy vấn HQL.
Sửa trên danh sách - sử dụng danh sách trong tệp ánh xạ NHibernate SILL yêu cầu ánh xạ cột chỉ mục. Bằng cách này danh sách sẽ được rút ra theo thứ tự chính xác mà nó được đưa vào. –
@Michael Gattuso Điểm tốt, tôi nên đề cập trong câu trả lời ở trên là tôi đã nói về các truy vấn HQL (do đó là 'thứ tự theo' bình luận) thay vì đặc tả bộ sưu tập thực tế trong tệp ánh xạ của bạn. – Jay
Một lợi ích của việc sử dụng túi là chúng không phải được nạp từ cơ sở dữ liệu khi bạn thêm các phần tử mới vào nó. Không có bản sao để kiểm tra, không có thứ tự để xác định. – tvaananen
- 1. EF có đặt mua bộ sưu tập không? Tương đương với danh sách trong danh sách Vs Vs Set Vs NHibernate thế giới
- 2. Danh sách vs Danh sách iterator
- 3. EF ICollection Vs Danh sách Vs IEnumerable Vs IQueryable
- 4. NHibernate - CreateCriteria vs CreateAlias
- 5. NHibernate ISet Vs IList
- 6. Danh sách + = tuple vs Danh sách = Danh sách + tuple
- 7. Haskell: Danh sách vs Luồng
- 8. Java Danh sách vs ArrayList
- 9. Sử dụng bộ nhớ, SortedList vs Danh sách sự cố
- 10. Tập hợp các bộ Python vs Danh sách
- 11. Lightspeed vs NHibernate
- 12. bộ lọc bản đồ vs danh sách hiểu
- 13. ArrayList vs Danh sách <object>
- 14. C# mảng vs danh sách chung
- 15. danh sách Scala chứa vs mảng chứa
- 16. NHibernate vs LINQ to SQL
- 17. ADO.NET Entity Framework vs NHibernate
- 18. mảng numpy Python vs danh sách
- 19. list.item (0) vs danh sách [0]
- 20. Prolog là vs = với danh sách
- 21. Performance quan tâm: StringCollection vs Danh sách <String>
- 22. Quyết định giữa NHibernate vs Entity Framework?
- 23. Ánh xạ thành phần NHibernate VS IUserType
- 24. Python: Danh sách vs Dict để tra cứu bảng
- 25. C# Danh sách Generic Extension Method vs Non-Generic
- 26. Exec vs ExecWait vs ExecShell vs nsExec :: Exec vs nsExec :: ExecToLog vs nsExec :: ExecToStack vs ExecDos vs ExeCmd
- 27. C#: Bất kỳ() vs Count() cho một danh sách trống
- 28. Mô hình MVC ASP.NET vs ViewData Để chọn danh sách
- 29. if-else vs ifelse với các danh sách
- 30. Haskell Danh sách Concatenation vs (đầu: đuôi) định dạng
3. ICollection có mã không? –
Firo
Re: # 2, chúng ta không thể sử dụng thường xuyên 'ISet' thay vì' Iesi'? –
@SergeyTachenov: xem http://stackoverflow.com/questions/9222058/can-net-4-iset-hashset-replace-nhibernate-iesi-collections-iset-hashset để có câu trả lời có thể. Khi câu trả lời này được viết ISet không phải là một phần của .net –