2011-01-22 40 views
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 

我们可以使用不同的和集团通过出示下列格式(产品详情)

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。

编辑:好的,我会离开上述起来为“理想”的解决方案,但如果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

感谢您的评论,但差的EF不支持ToDictionary运算符T T – ByulTaeng 2011-01-22 09:53:48

0

我在学习LINQ时遇到了这个问题,但我并不满意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,就像我一样。