返回带有列表对象的列表对象

时间:2019-01-29 13:57:07

标签: c# entity-framework linq entity-framework-6

我有三个表,分别是Car Makes,Car Model和CarsandModel。我有Carsand Model表,因为一个模型可以由多个制造商构建。我想返回包含汽车型号列表的汽车制造商列表。我现在的观点是没有过滤汽车型号的清单。

我试图添加一个where语句,但是我仍然没有得到正确的回报

public class CarMake
{
    public int CarMakeId { get; set; }
    public string CarMakeName { get; set; }
    public List<CarModel> CarModel { get; set; }

}
public class CarModel
{
    public int CarModelId { get; set; }
    public string CarModelName { get; set; }
}
public class CarsandModel
{
    public int CarMakeId { get; set; }
    public int CarModelId { get; set; }
}


var CarModel = (from cmake in db.CarModel
               select new CarModel
               {
                   CarModelId = cmake.CarMakeId,
                   CarModelName = cmake.CarMakeName,
                   CarMake= (from cmake in db.Carmake
                               join cam in db.CarsandModel on cmake.CarMakeId equals cam.CarMakeId
                               where (camodel.CarMakeId == cmake.CarMakeId)
                               select new Asset
                               {
                                   CarMakeId = cmodel.CarMakeId,
                                   CarMakeName = cmodel.CarMakeName
                               }).ToList()
               }
            ).ToList();

1 个答案:

答案 0 :(得分:1)

使用实体框架时,人们往往会自己(组)加入表,而使用ICollections则容易得多。

首先:stick to the Entity Framework Code-First Conventions!

例如:
每个CarMake都有零个或多个CarModels。您决定将其声明为List<CarModel>。您确定CarModel[4]具有定义的含义吗?我想知道CarModel.Insert(4, new CarModel())在您的代码中意味着什么。最好坚持使用数据库可以真正处理的界面:ICollection<CarModel>

CarMakesCarModels之间的关系似乎是多对多的:每个CarMake的零个或多个CarModels,每个CarModel为由零或多个CarMakes组成。

在关系数据库中,使用联结表实现了多对多关系。您的类CarsAndModel代表此联结表中的一行。但是,在使用实体框架时,无需提及连接表。在正确设计类时,实体框架会识别表之间的关系并为其创建适当的联结表。

class CarMake
{
    public int CarMakeId { get; set; }
    public string CarMakeName { get; set; }

    // every CarMake makes zero or more CarModels (many-to-many)
    public virtual ICollection<CarModel> CarModels { get; set; }
}
class CarModel
{
    public int CarModelId { get; set; }
    public string CarModelName { get; set; }

    // every CarModel is made by zero or more CarMakes (many-to-many)
    public virtual ICollection<CarMake> CarMakes {get; set;}
}
  

在实体框架中,表的列由非虚拟属性表示。虚拟属性表示表之间的关系(一对多,多对多,...)

出于完整性考虑,DbContext:

class CarContext : DbContext
{
    public DbSet<CarMake> CarMakes {get; set;}
    public DbSet<CarModel> CarModels {get; set;}
}

这是实体框架检测多对多关系所需要知道的全部内容。实体框架将为您创建联结表,并根据需要将此表保持最新。

仅当您有充分的理由偏离代码优先约定(并且可以说服项目负责人)时,才需要使用属性或流畅的API来告知实体框架您的偏差。

但是,如果我无法访问联结表,应该如何加入表?

回答:不要进行(group-)join,请使用ICollections!

  

要求:给我一些汽车模型,每个汽车模型都带有CarMakes

var result = dbContext.CarModels
    .Where(carModel => ...)       // only if you don't want all CarModels
    .Select(carModel => new
    {
         // Select only the properties you actually plan to use!
         Id = carModel.CarModelId,
         Name = carModel.CarModelName,
         ...

         CarMakes = carModel.CarMakes
             .Where(carMake => ...)     // only if you don't want all CarMakes of this model
             .Select(carMake => new
             {
                  // again: select only the properties you plan to use
                  Id = carMake.CarMakeId,
                  Name = carMake.Name,
                  ...
             })
             .ToList(),
    }

实体框架了解您的多对多关系,并将为您创建适当的(组)联接。