2012-02-14 13 views
5

linq投影を使用してList<Topic>を匿名または動的型に変換しようとしています...次のコードを使用していますが、正しく動作していないようです。私は子供フィールド(list<object/topic>)を列挙しようとした場合、それは、しかし、エラーなしで動的な型を返し、それはリスト<T> LINQ匿名または動的型への投影

結果ビュー=タイプ'<>f__AnonymousType6<id,title,children>'は「MyWebCore.dll」と「MvcExtensions.dll」の両方に存在すると言います

Strange。 - 基本的には、ツリービュー(jstree)に詰め込まれるPOCOSのリストです

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; 
} 

を私がやっているすべては自己含むオブジェクトのリストを平坦化されています。ここでは

は、私が使用していたコードです。

トピッククラスは次のように定義されます

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

そして、ここで返された動的オブジェクトの最初のメンバーがどのように見えるかの例です:あなたは同じLINQを持っていないのはなぜ

[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

あなたが別のアセンブリからFlattenTopicsを呼び出していますか?匿名型はアセンブリ全体で使用できません:http://stackoverflow.com/questions/2993200/return-consume-dynamic-anonymous-type-across-assembly-boundaries –

+0

LINQの結果は、匿名のタイプ:http://msdn.microsoft.com/en-us/magazine/ee336312.aspx –

+0

@Igor - no - MVCコントローラ内のアクションメソッドから... – bbqchickenrobot

答えて

0

は、適切な方法である - DTO/POCOにロードし、それを返すことがあります。

_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

二度コード? _Flatten funcを定義したら、すぐに呼び出すことができます - var topics = _Flatten(Repository.Query<Topic>().ToList()

2つの同一の匿名型(_Flatten関数の内側と外側の2つ)を作成しているようです。私はコンパイラがそれを処理するのに十分なスマートだと思うが、明示的に_Flattenを使用するようにあなたの呼び出しを変更してみてください、それが問題を解決するかどうかを確認してください。ここで

関連する問題