2017-03-13 32 views
0

使用EF来处理MVC 5应用程序。从二级表获取数据(实体框架)

我在我的数据库中有3个表。举个简单的例子,让我用这个....

  • 汽车
    • 编号
    • CarName
  • 颜色
    • 编号
    • ColorName
  • CarsColors
    • CarId
    • ColorId

汽车和颜色是 “主” 的表。 CarsColors是一个交叉参考表,可以存储各种组合。

目标:创建一个显示表的视图。每行都会显示汽车的详细信息。将会有一列“颜色”。在“颜色”栏中会显示该车使用的以逗号分隔的颜色列表。 (这是我的问题的核心。)因此,例如....

<table> 
 
    <th>Cars</th> 
 
    <th>Colors</th> 
 
    <tr> 
 
     <td>Kia Sportage</td> 
 
     <td>Red, Blue, Green</td> 
 
    </tr> 
 
    <tr> 
 
     <td>Toyota Camery</td> 
 
     <td>Green, Black</td> 
 
    </tr> 
 
    <tr> 
 
     <td>Honda Odyssey</td> 
 
     <td>(nothing)</td> 
 
    </tr> 
 
</table>

我不知道究竟是如何做到这一点。我知道我的汽车选择,我可以使用.Include()包括CarsColors。但是,我将如何去“上”一个级别获取Cars.ColorName?我需要通过CarsColors循环才能填充每行的最后一列,但使用颜色表作为实际颜色名称。

感谢

回答

0

你可以使用导航属性来获取颜色名称:

public partial class CarsColors 
{ 
    public int CarId { get; set; } 
    public int ColorId { get; set; } 

    public virtual Car Car { get; set; } 
    public virtual Color Color { get; set; } 
} 

因此,有类型的对象CarsColors你可以阅读下面的Color名称:

obj.Color.ColorName 

像下面这样的东西,你正在寻找:

var cars = dbContext.Cars 
        .Include(car=>car.CarsColors) 
        .GroupBy(car=>car.CarName) 
        .Select(gr=> new 
        { 
         CarName = gr.Key, 
         Colors = string.Join(",", gr.Select(car=>car.CarsColors.Color.ColorName)) 
        });