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

如何在中调用方法。在Linq查询中选择,而不必编写两次Select?

  •  1
  • SamuraiJack  · 技术社区  · 6 年前

    下面是我的代码。但正如你所看到的,我必须写两次select

    var lstCargoRequestVM = 
    (from c in db.Cargo
     join v in db.Vehicles on c.VehicleID equals v.VehicleID
     join cmp in db.Companies on c.CompanyID equals cmp.CompanyID
     where c.Isdeleted == false && c.IsActive == true
     select new CargoRequestVM
     {
         CargoId = c.CargoID,
         CompanyName = cmp.CompanyName,
         VehicleNo = v.VehicleNo,
         Date = c.DateOfPassage,
         Type = c.Type.ToString()                                       
    
     })
     .AsEnumerable()
     .Select(x => new CargoRequestVM
     {
         CargoId = x.CargoId,
         CompanyName = x.CompanyName,
         VehicleNo = x.VehicleNo,
         Date = x.Date,
         Type = CargoElements.CargoTypeName(x.Type.ToString())                                              
     }).ToList();
    

    是否可以在不写选择两次的情况下执行相同的操作?在某些情况下,可能会有十几个属性。我不想让我的代码变得不必要的冗长。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Cetin Basoz    6 年前

    这可能没有到基础数据库的转换,因此基本上需要写两次。但是,可以在使用类似方法语法(假设您实际上定义了一个良好的关系模式并设置了导航属性-在LINQ中,您很少需要join关键字)的位置之后应用aseNumerable():

    stVM = db.Cargo
             .Include( c => c.Vehicle )
             .Include( c => c.Company )
           .Where( c => !c.Isdeleted && c.IsActive )
           .AsEnumerable()
           .Select( c => new CargoRequestVM
           {
             CargoId = c.CargoID,
             CompanyName = c.Company.CompanyName,
             VehicleNo = c.Vehicle.VehicleNo,
             Date = c.DateOfPassage,
             Type = CargoElements.CargoTypeName(c.Type.ToString())                                       
           }).ToList();