2013-07-24 26 views
5

Tôi đang cố truy vấn bộ sưu tập có chứa thông tin Nhân viên. Khi tôi truy vấn bộ sưu tập mà tôi muốn trả lại một điều tra của các đối tượng trong đó mỗi đối tượng có hai lĩnh vực: (! Lưu ý rằng tất cả các giám đốc cũng là một nhân viên)LINQ Chọn trong một Chọn

  • Tên
  • ManagerName

Bây giờ, đây là vấn đề tôi đang gặp phải. Khi tôi làm một select trong một select, giá trị của lĩnh vực ManagerName được trả về trên từng đối tượng là:

System.Data.Common.Internal.Materialization.CompensatingCollection<string> 

Dưới đây là các truy vấn:

var query = 
    from e in db.Employees  
    select new 
    { 
     Name = e.Name, 
     ManagerName = 
      from em2 in db.Employees 
      where (em2.EmployeeID == e.ManagerID) 
      select em2.Name 
    }; 

Cụ thể, khi tôi nhìn vào giá trị của ManagerName, tôi thấy rằng nó là một liệt kê sản lượng một mục duy nhất. Và rằng mục duy nhất là một chuỗi có chứa tên của người quản lý. Vì vậy, tôi nghĩ rằng tôi gần gũi.

Câu hỏi: Làm cách nào để thay đổi truy vấn để thay vào đó trả về một đối tượng trong đó mỗi đối tượng chỉ có hai trường chuỗi, NameManagerName?

+0

Bạn muốn kết quả nào và bạn không có kết quả gì w? Bây giờ bạn không có một bộ sưu tập các chuỗi trong biến 'query'? – FSou1

+0

Bây giờ tôi có: obj.Name = "MyName"; obj.ManagerName = System.Data.Common.Internal.Materialization.CompensatingCollection và chỉ bên trong mà đối tượng nó có "MyManagerName" Tôi muốn: obj.Name = "Myname"; obj.ManagerName = "MyManagerName"; –

+1

Và bạn muốn làm gì? – FSou1

Trả lời

11

Hãy thử điều này:

var query = from e in db.Employees 
      select new 
      { 
       Name = e.Name, 
       ManagerName = db.Employees 
           .Where(x => x.EmployeeID == e.ManagerID) 
           .Select(x => x.Name).SingleOrDefault() 
      }; 

Tuy nhiên, nếu bạn ánh xạ một cách chính xác cơ sở dữ liệu của bạn với EF (mà tôi giả sử bạn đang sử dụng), bạn nên có một tài sản chuyển hướng bạn có thể sử dụng:

var query = from e in db.Employees 
      select new 
      { 
       Name = e.Name, 
       ManagerName = e.Manager.Name 
      }; 
+0

Nó hoạt động nhưng tôi phải đổi sang FirstOrDefault hoặc tôi đã nhận được lỗi này: {"Phương thức 'Đơn' và 'SingleOrDefault' chỉ có thể được sử dụng như một hoạt động truy vấn cuối cùng. Hãy xem xét sử dụng phương pháp 'FirstOrDefault' trong ví dụ này thay thế "} –

+0

Tôi vẫn không hiểu chủ đề của chủ đề muốn là gì: ( – FSou1

+0

@ FSou1: Anh ấy chỉ muốn có tên người quản lý cho từng nhân viên được chọn. –

2

Có vẻ như tự tham gia nên hoạt động:

var query = from e in db.Employees 
      join m in db.Employees on e.ManagerID equals m.EmployeeID 
       select new 
       { 
       Name = e.Name, 
       ManagerName = m.Name 
       }; 
+0

Tôi nghĩ rằng bạn cần phải sử dụng 'equals' thay vì' = 'trong điều kiện kết nối. –

+0

@DanielHilgarth Tốt bắt - sửa chữa. –