我有三张桌子--汽车制造,汽车型号和CarsandModel。我有Carsand表,因为一个模型可以由多个制造商建立。我想要返回一份有汽车型号清单的汽车制造清单。我现在的寂寞并不是过滤汽车上的清单,而是为汽车型号而设计的。
我试图添加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();发布于 2019-02-05 10:24:02
当使用实体框架时,人们倾向于(分组-)自己加入表,而使用ICollections则容易得多。
例如:
每个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;}
}这就是实体框架需要知道的,以检测多到多的关系。实体框架将为您创建连接表,并在需要时保持此表的更新。
只有当您有充分的理由偏离代码优先约定(并且您可以说服您的项目负责人)时,您才需要属性或fluent API来告知实体框架您的偏差。
,但是如果不能访问连接表,我应该如何加入这些表呢?
答:不要做(组-)加入,使用ICollections!
要求:给我CarModels,每个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(),
}实体框架了解您的多到多关系,并将为您创建适当的(组)连接。
https://stackoverflow.com/questions/54422703
复制相似问题