2011-08-04 23 views
6

Cách tôi có thể trả về danh sách với loại ẩn danh, vì mã này tôi nhận đượcdanh sách trả về với loại ẩn danh trong khung thực thể

"Không thể tìm thấy loại hoặc không gian tên 'T' hoặc tham khảo một hội?)"

tôi chỉ cần trở IdMember và UserName, nhờ

public static List<T> GetMembersItems(string ProjectGuid) 
    { 
     using (PMEntities context = new PMEntities("name=PMEntities")) 
     { 
      var items = context.Knowledge_Project_Members.Include("Knowledge_Project").Include("Profile_Information") 
         .Where(p => p.Knowledge_Project.Guid == ProjectGuid) 
         .Select(row => new { IdMember = row.IdMember, UserName = row.Profile_Information.UserName }); 

      return items.ToList(); 
     } 
    } 
+0

Để sử dụng một kiểu trả về chung chung như mà bạn cần để làm cho nó một phương pháp chung với một phụ '' như thế này: 'public static List GetMembersItems (chuỗi ProjectGuid)'. Nhưng bạn vẫn có các sự cố khác ... –

+0

có thể trùng lặp của [Loại vô danh trả về?] (Http://stackoverflow.com/questions/534690/return-anonymous-type) – nawfal

Trả lời

7

Như Jacob nói rằng bạn không thể trở về một loại vô danh nhưng bạn có thể tạo ra một lớp mới và sử dụng bên trong câu lệnh chọn của bạn. Đây là một câu hỏi tương tự cho Linq To Sql. Phương pháp tương tự có thể áp dụng cho khung thực thể.

LinqToSql Anonymous Type

5

Bởi vì bạn đang trở về đối tượng của một loại vô danh, bạn không thể tuyên bố rằng trong kiểu trả về của bạn cho phương pháp này. Việc bạn sử dụng chung số <T> sẽ không hoạt động cho việc này. Không có cách an toàn kiểu nào để khai báo một phương thức như thế. Nếu bạn khai báo kiểu trả về của mình là IList thì thao tác đó sẽ hoạt động, nhưng bạn vẫn sẽ không có loại an toàn.

Bạn thực sự tốt hơn khi tuyên bố loại.

Cập nhật:

Khai báo một kiểu trả về đơn giản không phải là quá xấu. Bạn có thể viết một lớp học như thế này:

public class MemberItem 
{ 
    public string IdMember { get; set; } 
    public string UserName { get; set; } 
} 

Và sau đó viết phương pháp của bạn như thế này:

public static List<MemberItem> GetMembersItems(string ProjectGuid) 
{ 
    using (PMEntities context = new PMEntities("name=PMEntities")) 
    { 
     var items = context.Knowledge_Project_Members.Include("Knowledge_Project").Include("Profile_Information") 
        .Where(p => p.Knowledge_Project.Guid == ProjectGuid) 
        .Select(row => new MemberItem { IdMember = row.IdMember, UserName = row.Profile_Information.UserName }); 

     return items.ToList(); 
    } 
} 
+0

cảm ơn bạn đã trả lời, đó là cách tốt nhất để trả về một danh sách với lựa chọn này? – Pablogrind

+1

Xem cập nhật của tôi cho một mẫu – Jacob

+0

cảm ơn jacob vì sự giúp đỡ của bạn – Pablogrind

3

Phạm vi các kiểu nặc danh được giới hạn cho các phương pháp, trong đó họ được định nghĩa. Trong trường hợp của bạn, bạn tốt hơn khai báo một lớp riêng biệt với các thuộc tính có liên quan và trả về một tập hợp các cá thể của lớp đó. Ví dụ:

public class UserDetail 
{ 
    public int Id{get;set;} 
    public string UserName {get;set;} 
} 

public static List<UserDetail> GetMembersItems(string ProjectGuid) 
    { 
     using (PMEntities context = new PMEntities("name=PMEntities")) 
     { 
      var items = context.Knowledge_Project_Members.Include("Knowledge_Project").Include("Profile_Information") 
         .Where(p => p.Knowledge_Project.Guid == ProjectGuid) 
         .Select(row => new UserDetail{ IdMember = row.IdMember, UserName = row.Profile_Information.UserName }); 

      return items.ToList(); 
     } 
    } 
11

Lớp tuple <> được thực hiện cho những tình huống như thế này. Tạo một lớp tùy chỉnh như đã đề xuất là rõ ràng hơn, nhưng Tupple cũng đã hoàn thành công việc.

ví dụ:

.Select(row => new Tuple<int,string>(row.IdMember,row.Profile_Information.UserName)) 

để truy cập các thuộc tính thành viên ở phía bên kia của dây, bạn sẽ cần phải sử dụng:

var id=t.Item1 
var name=t.Item2 
+3

Tuples không hoạt động trong khuôn khổ thực thể vì bạn cần tạo chúng bằng chức năng intializer và khung thực thể của chúng chỉ cho phép bạn sử dụng các kiểu với các hàm tạo mặc định – Rabbi

+0

@Rabbi: Bạn có thể chiếu loại vô danh như một đếm và sau đó sử dụng một bộ dữ liệu để dự án trong bộ nhớ. Xem thêm: http://stackoverflow.com/questions/2118688/return-tuple-from-ef-select – arviman

+0

Làm thế nào về ValueTuple? – Shimmy

0

Bạn có thể trả về kiểu: NameValueCollection hoặc KeyValuePair để thay thế. loại ẩn danh không thể là loại trả về.

1

Chỉ cần sử dụng và ArrayList thay

public static ArrayList GetMembersItems(string ProjectGuid) 
    { 
     ArrayList items = new ArrayList(); 

       items.AddRange(yourVariable 
         .Where(p => p.Knowledge_Project.Guid == ProjectGuid) 
         .ToList()); 
      return items; 
    } 
1

Bạn có thể trở lại kiểu nặc danh bằng cách đúc họ Object, nhưng điều này hiếm khi hữu ích. Tuy nhiên nếu bạn đang trả lại nó từ nói một bộ điều khiển WebApi như là một DTO nhanh chóng và (không như vậy) bẩn sau đó tôi nghĩ rằng nó là hoàn toàn tốt đẹp. Tính năng này chỉ hoạt động với JSON.XML sẽ phàn nàn về giản đồ hoặc một cái gì đó, nhưng ngày nay tất cả mọi người sử dụng JSON anyway :)

public static List<Object> GetMembersItems(string ProjectGuid) 
{ 
    using (PMEntities context = new PMEntities("name=PMEntities")) 
    { 
     var items = context.Knowledge_Project_Members.Include("Knowledge_Project").Include("Profile_Information") 
        .Where(p => p.Knowledge_Project.Guid == ProjectGuid) 
        .Select(row => new { IdMember = row.IdMember, UserName = row.Profile_Information.UserName }); 

     return items 
       .ToList() // this is only needed to make EF happy otherwise it complains about the cast 
       .Cast<Object>() 
       .ToList(); 
    } 
} 
Các vấn đề liên quan