2017-05-25 7 views
0

各ノードがid,text、および複数のattributesを持つツリー上にデータを表現する必要があります。LINQ to Entities - 複雑なオブジェクトの初期化(DictionaryまたはList <KeyValuePair>)

私はattributesプロパティを一般的なままにしておき、LINQ to Entitiesを使用して初期化しました。


試み1:私のクラスでは

として:私は初期化しようとした

public class TreeNode 
{ 
    public int id { get; set; } 
    public string text { get; set; } 
    public Dictionary<string, object> attributes { get; set; } 
    public int? parent { get; set; } 
} 

:上記

List<TreeNode> taskItems = new List<TreeNode>(); 
using (var database = new MyDatabase()) 
{ 
    taskItems = 
    (
     from t in database.Task 
     select new TreeNode() 
     { 
      id = t.ID, 
      text = t.Name, 
      attributes = new Dictionary<string, object>() 
      { 
       { "Color", t.Color }, 
       { "Category", t.Category } 
      }, 
      parent = t.ParentID 
     } 
    ) 
    .ToList(); 
} 

はエラー

で失敗します0

LINQ to Entitiesでは、単一要素のリスト初期化項目のみがサポートされています。


試み2

Iは、List<KeyValuePair>代わりにDictionaryを試みた:

public class TreeNode 
{ 
    public int id { get; set; } 
    public string text { get; set; } 
    public List<KeyValuePair<string, object>> attributes { get; set; } 
    public int? parent { get; set; } 
} 

Iが初期化しようとした:

List<TreeNode> taskItems = new List<TreeNode>(); 
using (var database = new MyDatabase()) 
{ 
    taskItems = 
    (
     from t in database.Task 
     select new TreeNode() 
     { 
      id = t.ID, 
      text = t.Name, 
      attributes = new List<KeyValuePair<string, object>>() 
      { 
       new KeyValuePair<string, object>("Color", t.Color), 
       new KeyValuePair<string, object>("Category", t.Category) 
      }, 
      parent = t.ParentID 
     } 
    ) 
    .ToList(); 
} 

上記

のみパラメータなしのコンストラクタと初期化子はエンティティへのLINQでサポートされているエラーで失敗し、この時間。


どのように私はattributesプロパティの初期化を達成することができますか?

+0

[このSO](https://stackoverflow.com/questions/35014278/how-to-create-a-dictionary-in-linq -personating-a-class/35014914)があなたに役立つはずです。 –

答えて

2
database.Task 
.Select(t=> new 
{ 
      t.ID, 
      t.Name, 
      t.Color, 
      t.Category, 
      t.ParentID 
}).AsEnumerable() 
.Select(t=> new TreeNode 
     { 
      id = t.ID, 
      text = t.Name, 
      attributes = new List<KeyValuePair<string, object>> 
      { 
       new KeyValuePair<string, object>("Color", t.Color), 
       new KeyValuePair<string, object>("Category", t.Category) 
      }, 
      parent = t.ParentID 
     }).ToList() 
+0

これは機能しました。私はシンタックスの代替として自分の作業コードを投稿しました。 – SNag

+0

事は次のとおりです:この場合、色とカテゴリである2つのタイプの属性のみを持つ場合。 Listを定義する目的は何ですか?私は単に色とカテゴリとして2つのプロパティを定義するだけでした。なぜ私は辞書やリストを使ったのか分からなかった。 – ArgeKumandan

+0

上記のコードは、より多くの属性プロパティを持つ制作コードの簡略版です。 – SNag

2

KeyValuePairは不変です。インスタンスの作成後に値を変更することはできません。 は、カスタムクラスを作成します。あなたのLINQ文でより

class KeyValuePairCustom<T,S> 
{ 
    public KeyValuePairCustom() {} 

    public T Key {get;set;} 
    public S Value {get;set;} 
} 

は、次のコードを使用します。

List<TreeNode> taskItems = new List<TreeNode>(); 
using (var database = new MyDatabase()) 
{ 
    taskItems = 
    (
     from t in database.Task 
     select new TreeNode() 
     { 
      id = t.ID, 
      text = t.Name, 
      attributes = new List<KeyValuePairCustom<string, object>>() 
      { 
       new KeyValuePairCustom<string, object>() { 
        Key="Color", 
        Value = t.Color 
       }, 
       new KeyValuePair<string, object>() { 
        Key = "Category", 
        Value = t.Category 
       } 
      }, 
      parent = t.ParentID 
     } 
    ) 
    .ToList(); 
} 
2

@ArgeKumandanのソリューションは、動作します。

これは構文代替であり、そしてDictionaryを使用する:

List<TreeNode> taskItems = new List<TreeNode>(); 
using (var database = new MyDatabase()) 
{ 
    taskItems = 
    (
     from t in database.Task 
     select new 
     { 
      id = t.ID, 
      text = t.Name, 
      color = t.Color, 
      category = t.Category, 
      parent = t.ParentID 
     } 
    ) 
    .AsEnumerable() 
    .Select(t => new TreeNode() 
    { 
     id = t.id, 
     text = t.text, 
     attributes = new Dictionary<string, object>() 
     { 
      { "color", t.color }, 
      { "category", t.category } 
     }, 
     parent = t.parent 
    }) 
    .ToList(); 
} 
関連する問題