2012-02-14 28 views
5

Tôi đang cố chuyển đổi List<Topic> thành loại ẩn danh hoặc động thông qua phép chiếu LINQ ... Tôi đang sử dụng mã sau, nhưng dường như không hoạt động đúng cách . Nó trả về kiểu động mà không có lỗi, tuy nhiên, nếu tôi cố gắng liệt kê các lĩnh vực trẻ em (list<object/topic>) sau đó nó nóiDanh sách <T> LINQ Chiếu thành Ẩn danh hoặc Kiểu động

Xem Kết Quả = Loại '<>f__AnonymousType6<id,title,children>' tồn tại trong cả hai 'MyWebCore.dll' và 'MvcExtensions.dll'

Lạ.

Đây là mã tôi đang sử dụng:

protected dynamic FlattenTopics() 
{ 
    Func<List<Topic>, object> _Flatten = null; // satisfy recursion re-use 
    _Flatten = (topList) => 
    { 
     if (topList == null) return null; 

     var projection = from tops in topList 
         select new 
         { 
          id = tops.Id, 
          title = tops.Name, 
          children = _Flatten(childs.Children.ToList<Topic>()) 
         }; 
     dynamic transformed = projection; 
     return transformed; 
    }; 

    var topics = from tops in Repository.Query<Topic>().ToList() 
       select new 
       { 
        id = tops.Id, 
        title = tops.Name, 
        children = _Flatten(tops.Children.ToList<Topic>()) 
       }; 

    return topics; 
} 

Tất cả tôi đang làm là làm phẳng một danh sách các đối tượng tự chứa - về cơ bản đó là một danh sách các POCOs sẽ được nhồi vào một cái nhìn cây (jstree) .

Lớp Topic được định nghĩa là:

public class Topic 
{ 
    public Guid Id {get;set;} 
    public string Name {get;set;} 
    public List<Topic> Children {get;set;} 
} 

Và đây là một ví dụ về những gì thành viên đầu tiên của đối tượng năng động trở lại trông giống như:

[0] = { 
    id = {566697be-b336-42bc-9549-9feb0022f348}, 
    title = "AUTO", 
    children = {System.Linq.Enumerable.SelectManyIterator 
      <MyWeb.Models.Topic, 
      MyWeb.Models.Topic, 
      <>f__AnonymousType6<System.Guid,string,object> 
      >} 
} 
+3

Bạn đang gọi từ lắp ráp khác? Không thể sử dụng các loại ẩn danh trên các cụm: http://stackoverflow.com/questions/2993200/return-consume-dynamic-anonymous-type-across-assembly-boundaries –

+0

Kết quả LINQ không hoạt động tốt ngoài phạm vi, do các loại ẩn danh: http://msdn.microsoft.com/en-us/magazine/ee336312.aspx –

+0

@Igor - no - từ một phương thức Hành động trong bộ điều khiển MVC của tôi ... – bbqchickenrobot

Trả lời

0

Đây là cách thích hợp - đã để nạp vào một DTO/POCO và trả lại rằng:

FlattenTopics
_Flatten = (topList) => 
     { 
      if (topList == null) return null; 

      var projection = from tops in topList 
          //from childs in tops.Children 
          select new JsTreeJsonNode 
          { 
           //id = tops.Id.ToString(), 
           data = tops.Name, 
           attr = setAttributes(tops.Id.ToString(), tops.URI), 
           state = "closed", 
           children = _Flatten(tops.Children) 
          }; 


      return projection.ToList(); 
     }; 
0

Tại sao bạn có LINQ cùng mã hai lần? Sau khi bạn xác định hàm _Flatten func, bạn có thể gọi ngay lập tức - var topics = _Flatten(Repository.Query<Topic>().ToList().

Dường như bạn đang tạo hai loại ẩn danh giống hệt nhau, một loại bên trong hàm _Flatten func và một bên ngoài nó. Tôi nghĩ rằng trình biên dịch đủ thông minh để xử lý điều đó, nhưng hãy thử thay đổi cuộc gọi của bạn để sử dụng rõ ràng _Flatten, xem liệu nó có giải quyết được vấn đề hay không.

Các vấn đề liên quan