1

みましょう、私は次のクラスを持っていると言う:LINQで同時に別名とグループを指定しますか?

Product { ID, Name } 

Meta { ID, Object, Key, Value } 

Category { ID, Name } 

Relation {ID, ChildID, ParentID } (Child = Product, Parent = Category) 

といくつかのサンプルデータ:

製品:

ID Name 

1 Chair 
2 Table 

メタ

ID Object Key  Value 

1  1  Color "Red" 
2  1  Size "Large" 
3  2  Color "Blue" 
4  2  Size "Small" 

カテゴリー

ID Name 

1 Indoor 
2 Outdoor 

関係

ID ChildID ParentID 

1  1   1 
2  1   2 
3  2   1 

は、我々は我々が使用して最初の項目の「色」の値を取得することができ、次の形式(ProductDetail)

ID=1, 
Name=Chair, 
Parent= 
{ 
    { ID=1, Name="Indoor" }, 
    { ID=2, Name="Outdoor" } 
}, 
Properties { Color="Red", Size="Large" } 

ID=2, 
Name=Table, 
Parent= 
{ 
    { ID=1, Name="Indoor"} 
}, 
Properties { Color = "Blue", Size = "Small" } 

を生成することにより、個別およびグループを使用できます

ProductDetails[0].Properties.Color 

ご協力いただけると助かります。

答えて

0

いいえ、あなたが言ってきたものに基づいてこれを行うことはできません - 「カラー」と「サイズ」データの一部ではなく、モデルの一部であるため。実行時にのみ認識されるので、動的タイピングを使用しない限り、Properties.Colorでアクセスすることはできません。あなたは、しかし、潜在的にProperties["Color"]を使用することができ

var query = from product in db.Products 
      join meta in db.Meta 
       on product.ID equals meta.Object 
       into properties 
      select new { Product = product, 
         Properties = properties.ToDictionary(m => m.Key, 
                   m => m.Value) }; 

をので、各製品のために、あなたは、プロパティの辞書を持っています。それはを論理的にで動作させますが、エンティティフレームワークで動作させるには、それを調整する必要があるかもしれません。ToDictionaryをどれだけうまくサポートしているか分かりません。

EDIT:さて、私は「理想的な」解決策として、上記を任せるが、EFはToDictionaryをサポートしていない場合、あなたはその部分を行う必要があるだろう、インプロセス:

var query = (from product in db.Products 
      join meta in db.Meta 
       on product.ID equals meta.Object 
       into properties 
      select new { product, properties }) 
      .AsEnumerable() 
      .Select(p => new { 
        Product = p.product, 
        Properties = p.properties.ToDictionary(m => m.Key, 
                  m => m.Value) }); 
+0

urのコメントありがとうございますが、貧弱なEFはToDictionary演算子T T – ByulTaeng

+0

@NVAをサポートしていません。その場合、おそらくAsEnumerable ...編集を使用して行うことができます。 –

+0

ur迅速な返信をもう一度ありがとうが、私は結合を使用して別のテーブル(私のポストで編集)からいくつかの余分な情報を含める場合は、生成されたSQLはSELECTの束とあまりにも長いです... FROM ...方法はありますか?それを掃除する? – ByulTaeng

0

私はちょうどLINQを学んでいる間にこの質問に出くわしましたが、私はJonの出力が問題(申し訳ありませんJon)と一致しているとは思っていませんでした。私はあなたがしたことを実感)

;

var ProductDetails = (from p in Product 
         let Parents = from r in Relation 
            where r.ChildID == p.ID 
            join c in Category on r.ParentID equals c.ID 
             into RelationCategory 
            from rc in RelationCategory 
            select new 
            { 
             rc.ID, 
             rc.Name 
            } 
         join m in Meta on p.ID equals m.Object into ProductMeta 

         select new 
         { 
          p.ID, 
          p.Name, 
          Parent = Parents.ToList(), 
          ProductMeta 
         }) 
        .AsEnumerable() 
        .Select(p => new 
        { 
         p.ID, 
         p.Name, 
         p.Parent, 
         Properties = p.ProductMeta 
             .ToDictionary(e => e.Key, e => e.Value) 
        }).ToList(); 

クレジットは、ジョンスキートおよびVisual Studioデバッガにほとんど行く:次のコードは、より良いあなたの質問の構造と一致して匿名で型付けされたオブジェクトのリストを返します。おそらくこれまでに移動しましたが、うまくいけば、これは他の人がLINQを学ぶのを助けるかもしれません。

関連する問題