我有三个表,分别是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();
答案 0 :(得分:1)
使用实体框架时,人们往往会自己(组)加入表,而使用ICollections
则容易得多。
首先:stick to the Entity Framework Code-First Conventions!
例如:
每个CarMake
都有零个或多个CarModels
。您决定将其声明为List<CarModel>
。您确定CarModel[4]
具有定义的含义吗?我想知道CarModel.Insert(4, new CarModel())
在您的代码中意味着什么。最好坚持使用数据库可以真正处理的界面:ICollection<CarModel>
。
CarMakes
和CarModels
之间的关系似乎是多对多的:每个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(),
}
实体框架了解您的多对多关系,并将为您创建适当的(组)联接。