【问题标题】:How to call a method within .Select in Linq query without having to write select twice?如何在 Linq 查询中调用 .Select 中的方法而无需两次编写 select?
【发布时间】:2026-01-18 00:50:01
【问题描述】:

以下是我的有效代码。但正如你所见,我不得不写两次 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();

是否可以在不必写两次 select 的情况下做同样的事情?在某些情况下,可能有十几个属性。我不想让我的代码不必要地冗长。

【问题讨论】:

  • 是什么让你觉得你需要写 2 个select 语句?
  • 你可以做(from ....where...).AsEnumerable().Select(x => new CargoRequestVM{ .... });
  • 您使用的是 EF 吗?在第一次选择中尝试使用 CargoElements.CargoTypeName 时是否出现异常?
  • 我无法申请AsEnumerable,因为它给了我错误:..must end with select or group by..

标签: c# asp.net .net linq


【解决方案1】:

可能不会翻译到底层数据库,因此您基本上需要编写两次。但是,您可以在使用方法语法之后应用 AsEnumerable()(假设您实际上定义了良好的关系模式并设置了导航属性 - 在 Linq 中您很少需要 join 关键字):

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();

【讨论】: