首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回列表对象和列表对象

问返回列表对象和列表对象
EN

Stack Overflow用户
提问于 2019-01-29 13:57:06
回答 1查看 2.1K关注 0票数 2

我有三张桌子--汽车制造,汽车型号和CarsandModel。我有Carsand表,因为一个模型可以由多个制造商建立。我想要返回一份有汽车型号清单的汽车制造清单。我现在的寂寞并不是过滤汽车上的清单,而是为汽车型号而设计的。

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

代码语言:javascript
复制
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();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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表示此连接表中的一行。但是,在使用实体框架时,不需要提及连接表。当正确设计类时,实体框架会识别表之间的关系,并为其创建合适的连接表。

代码语言:javascript
复制
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:

代码语言:javascript
复制
class CarContext : DbContext
{
    public DbSet<CarMake> CarMakes {get; set;}
    public DbSet<CarModel> CarModels {get; set;}
}

这就是实体框架需要知道的,以检测多到多的关系。实体框架将为您创建连接表,并在需要时保持此表的更新。

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

,但是如果不能访问连接表,我应该如何加入这些表呢?

答:不要做(组-)加入,使用ICollections!

要求:给我CarModels,每个CarMakes都有

代码语言:javascript
复制
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(),
    }

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54422703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档