Linq到实体组由多对多组成

时间:2015-03-31 15:12:21

标签: c# linq entity-framework group-by linq-to-entities

我有3个实体,有很多/很多关系:

产品 - < Products_vehicles> - 车辆

1个产品可以有很多车辆

1辆车可以有很多产品

与所有很多/很多关系一样,products_vehicles类被隐藏,并在EF上显示为实体的导航属性 所以我的课程看起来像这样:

public partial class product
    public int id { get; set; }
    public string part_name { get; set; }
    public virtual ICollection<vehicle> vehicles { get; set; }

 public partial class vehicle
{
    public int id { get; set; }
    public string make { get; set; }
    public string model { get; set; }
    public virtual ICollection<product> products { get; set; }

我可以轻松获得产品和所有相关车辆

我希望按照车辆的品牌,型号对产品进行分组,所以我的输出看起来像这样:

产品编号:5 part_name:门 make:福特 模特:专注

产品编号:5 part_name:门 制作:萨博 型号:9-3

这可能吗?

更新

为了更清楚,这是一个例子:

所以,假设我有一款名为'bonnet'的产品,它适用于5种不同的车型:

  • 福特福克斯1.6L
  • 福特嘉年华2L
  • 福特嘉年华1.6L
  • 福特蒙迪欧2L
  • 福特蒙迪欧1.8L

目前,我正在购买1款产品,其中包含列出以上所有5种车型的车辆。

我希望它们首先分为'partname'(引擎盖),其次是'make',第三是'model'。结果应该是:

Bonnet > Ford, Fiesta 2L

         Ford, Fiesta 1.6L

Bonnet > Ford, Mondeo 2L

         Ford, Mondeo 1.8L

Bonnet > Ford, Focus 1.6L

这在SQL中非常简单,但我很难在Linq中解决这个问题。

任何帮助非常感谢

1 个答案:

答案 0 :(得分:0)

我猜你想要的是检索已经选择的平面记录:产品ID,产品部件名称,车辆制造商和车辆型号。如果没有,请忽略该答案。

return dbcontext.products.SelectMany(
    p => p.vehicles.Select(
        v => new {
            product_id = p.id,
            part_name = p.part_name,
            make = v.make,
            model = v.model
            }
        )
    );

如果您不想重复产品数据(实际上非​​常推荐),那么您可以使用嵌套车辆数组的以下方法:

return dbcontext.products.Select(
    p => new {
        product_id = p.id,
        part_name = p.part_name,
        vehicles = p.vehicles.Select(
            v => new { make = v.make, model = v.model }
        }
    );

dbcontext.products是与数据库中的产品对应的DbSet;它可能在您的代码中以不同方式调用。

干杯〜!