代码之家  ›  专栏  ›  技术社区  ›  StepUp

Select()中的条件Select()

  •  0
  • StepUp  · 技术社区  · 6 年前

    我有一个简单的表“Cars”:

    IdCar      |   Name     |     Id_Base
     1             Toyota          null
     2             Honda           5
     3             Ford            4
     4             Buick           null 
     5             Volvo           1
    

    Id_Base 是对 IdCar 此表的字段 Cars . 这就像一个循环引用。我知道这很奇怪,但我什么都做不了。

    我有一个 CarDTO :

    public class CarDTO
    {       
        public int IdCar { get; set; }
        public int? Id_Base { get; set; }
        public string Name { get; set; }
        public CarDto InnerCar {get; set; }
    }       
    

    我的目标是投影表的每个元素 汽车 CarDTO公司 如果 Id_底座 NOT NULL . 那是我得到的 Car 根据its IdCar公司 和填充 InnerCar 的属性 CarDTO公司 .

    因此,期望的结果应该是这样的:

    new Car(){ IdCar = 1, Name = "Toyota", Id_Base = null},
    
    new Car(){ IdCar = 2, Name = "Honda", Id_Base = 5, 
        InnerCar = new Car(){ IdCar = 5, Name="Volvo" }},
    
    new Car(){ IdCar = 3, Name = "Ford", Id_Base = 4, 
        InnerCar = new Car(){ IdCar = 4, Name="Buick" }},
    
    new Car(){ IdCar = 4, Name = "Buick", Id_Base = null },
    
    new Car(){ IdCar = 5, Name = "Volvo", Id_Base = 1, 
        InnerCar = new Car(){ IdCar = 5, Name="Toyota" }}
    

    我试过的:

    var cars = from car in db.Cars
         let innerCar =
             (from inCar in db.Cars
              where inCar.id_Base != null && inCar.IdCar == car.IdCar
              select new CarDTO
              {                                       
                   Name = inCar.Name,
                   IdCar = inCar.IdCar,                                       
                   IdBase = inCar.id_Base,
                   InnerCar = null
               }
               ).FirstOrDefault(x => x.IdBase == car.id_Base)
           select new CarDTO
               {                                  
                   Name = car.Name,
                   IdCar = car.IdCar,                                  
                   IdBase = car.id_Base,
                   InnerCar = innerCar
               };
    

    但是 车内 始终为空。我不明白我做错了什么。有人知道如何投影每个元素并创建 车内 ?

    2 回复  |  直到 6 年前
        1
  •  2
  •   netaholic    6 年前

    有人知道如何投影每个元素并创建InnerCar吗?

    我不知道。但我仍然认为我可以帮助你。

    首先,如果你不知道mapper库是什么,请看看它是什么。”例如Automapper。它可以极大地简化你的生活。 如果你不喜欢使用它,你可以通过简单地使用字典来设置内部汽车。这将花费你O(n),这是一个简单的代码,这是一个加号

          class Program
          {
            static void Main(string[] args)
            {
              var allCars = GetAllCars();
              var allCarsDtoDict = allCars.Select(a =>
              new CarDTO() { Id_Base = a.Id_Base, IdCar = a.IdCar, Name = a.Name }).ToDictionary(a => a.IdCar, a => a);
              foreach (var car in allCarsDtoDict.Values)
              {
                if (car.Id_Base.HasValue)
                  car.InnerCar = allCarsDtoDict[car.Id_Base.Value];
              }
    
              var allCardWithSetInnerCard = allCarsDtoDict.Values;
            }
    
            private static IEnumerable<CarDO> GetAllCars()
            {
              return new List<CarDO>()
              {
                new CarDO(){ IdCar = 1, Name = "Toyota", Id_Base = null},
                new CarDO(){ IdCar = 2,Name = "Honda",Id_Base = 5,},
                new CarDO(){ IdCar = 3,Name = "Ford",Id_Base = 4},
                new CarDO(){ IdCar = 4, Name = "Buick", Id_Base = null },
                new CarDO(){IdCar = 5,Name = "Volvo",Id_Base = 1,}
              };
            }
          }
    
        2
  •  0
  •   Rand Random    6 年前

    那条线 inCar.IdCar == car.IdCar 似乎错了。

    可能应该是这样 inCar.IdBase == car.IdCar .

    你的线路只能得到相同的 IdCar .

    或者你想写:

    inCar.IdCar != car.IdCar -不平等而不是平等

    var cars = (from car in db.Cars
              select new CarDTO
              {                                       
                   Name = car.Name,
                   IdCar = car.IdCar,                                       
                   IdBase = car.id_Base,
               }).ToList(); //call .ToList() to fix possible EF errors by materializing all objects
    
    cars.ForEach(x => x.InnerCar = cars.FirstOrDefault(y => y.IdCar == x.IdBase));