2010-01-06 39 views
7

Tôi có cấu trúc cây biểu đồ tổ chức được lưu trữ trong cơ sở dữ liệu. Có phải là cái gì đó nhưTruy xuất cấu trúc cây từ cơ sở dữ liệu bằng LINQ

ID (int); 
Name (String); 
ParentID (int) 

Trong C# nó được đại diện bởi một lớp học như

class Employee 
{ 
int ID, 
string Name, 
IList < Employee> Subs 
} 

tôi tự hỏi như thế nào là cách tốt nhất để lấy các giá trị từ cơ sở dữ liệu để điền vào C# Đối tượng sử dụng LINQ (Tôi đang sử dụng Khung thực thể)

Phải có điều gì đó tốt hơn là thực hiện cuộc gọi để đạt được cấp cao nhất sau đó thực hiện các cuộc gọi lặp lại để nhận người đăng ký và v.v.

Cách tốt nhất để làm điều đó?

Trả lời

1

Tôi muốn thêm trường vào thực thể để bao gồm ID cha, sau đó tôi sẽ kéo toàn bộ bảng vào bộ nhớ để trống danh sách subs. Id sau đó lặp qua các đối tượng và điền danh sách bằng cách sử dụng LINQ cho các đối tượng. Chỉ có một truy vấn DB nên hợp lý.

+0

Cách tôi tìm thấy để làm điều này là một cái gì đó giống như foreach (vị trí Vị trí trong tất cả) { foreach (Chức vụ position1 trong tất cả) { if (position1.ParentPositionID == position.ID) { if (position.Subs == null) { position.Subs = new List (); } position.Subs.Add (position1); } } } Có cách nào tốt hơn không? – Emad

0

Một Entity Framework truy vấn nên cho phép bạn để bao gồm các bộ đơn vị liên quan, mặc dù trong một mối quan hệ nhất nguyên, không chắc chắn nó sẽ làm việc như thế nào ...

Kiểm tra này ra để biết thêm thông tin về rằng: http://msdn.microsoft.com/en-us/library/bb896272.aspx

0

Vâng ... ngay cả với LINQ bạn sẽ cần hai truy vấn, bởi vì bất kỳ truy vấn nào sẽ nhân đôi nhân viên chính và do đó sẽ dẫn đến nhiều nhân viên (thực sự giống nhau) đang được tạo ... Tuy nhiên, bạn có thể ẩn một chút với LINQ khi bạn tạo đối tượng, đó là khi bạn thực hiện truy vấn thứ hai, như sau:

var v = from u in TblUsers 
     select new { 
      SupervisorName = u.DisplayName, 
      Subs = (from sub in TblUsers where sub.SupervisorID.Value==u.UserID select sub.DisplayName).ToList() 
     }; 
3
  1. Bạn có thể tạo một tệp lưu trữ được tích hợp sẵn trong đệ quy. Hãy xem http://msdn.microsoft.com/en-us/library/ms190766.aspx để biết thêm thông tin về Biểu thức Bảng chung trong SQL Server
  2. Bạn có thể muốn tìm một cách khác (tốt hơn?) Để lập mô hình dữ liệu của mình. http://www.sqlteam.com/article/more-trees-hierarchies-in-sql liệt kê một cách phổ biến để lập mô hình dữ liệu phân cấp trong cơ sở dữ liệu. Thay đổi mô hình có thể cho phép bạn tạo các truy vấn có thể được biểu diễn mà không cần đệ quy.
2

Nếu bạn đang sử dụng SQL Server 2008, bạn có thể sử dụng tính năng new HIERARCHYID.

Tổ chức đã đấu tranh trong quá khứ với các đại diện của cây như cấu trúc trong cơ sở dữ liệu, rất nhiều tham gia rất nhiều của logic phức tạp đi vào nơi, cho dù đó là tổ chức hệ thống phân cấp hoặc xác định một BOM (Bill của Vật liệu) trong đó một sản phẩm hoàn thành phụ thuộc vào một bán thành phẩm khác vật liệu/kit mặt hàng và các bộ này các mặt hàng phụ thuộc vào một bán thành phẩm hoặc nguyên liệu thô khác.

SQL Server 2008 có giải pháp cho vấn đề nơi chúng tôi lưu trữ toàn bộ phân cấp trong kiểu dữ liệu Cấu trúc phân cấp. Cấu trúc phân cấp là một loại dữ liệu hệ thống có độ dài biến.HierarchyId được sử dụng để xác định vị trí vị trí trong hệ thống các yếu tố như Scott là CEO và Mark cũng như Ravi báo cáo cho Scott và Ben và Laura báo cáo cho Mark, Vijay, James và Frank báo cáo Ravi.

Vì vậy, hãy sử dụng các chức năng mới có sẵn và chỉ cần trả lại dữ liệu bạn cần mà không cần sử dụng LINQ. Nhược điểm là bạn sẽ cần phải sử dụng UDF hoặc thủ tục lưu trữ cho bất cứ điều gì ngoài một truy vấn gốc đơn giản:

SELECT @Manager = CAST('/1/' AS hierarchyid)   
SELECT @FirstChild = @Manager.GetDescendant(NULL,NULL) 
Các vấn đề liên quan