You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用LINQ从两张表查询字段?遇InvalidCastException报错

LINQ Join查询类型转换异常解决

错误信息

System.InvalidCastException: 'Unable to cast object of type '<>f__AnonymousType213[System.Int32,System.Nullable1[System.Int32],System.String,System.String,,System.Nullable1[System.DateTime],System.Nullable1[System.Int32],System.Nullable1[System.Decimal],System.Nullable1[System.DateTime],System.Nullable1[System.Decimal],System.Nullable1[System.Decimal]]' to type 'ProjectA.Models.Planting'.'

数据表结构

Planting表

CropIDCropNamePlantDatePlantQtySiteID
03Broccoli22/05/2017100PlotA
02Mango08/06/201720PlotD
06Apple02/07/201820PlotF

Harvest表

IdCropNameHarvestDateWeightCropID
1Broccoli05/05/20242.0003
2Mango07/05/202410.0002
3Apple10/05/20244.0006

尝试的代码

public class PlantingController : Controller
{
    private readonly dbContext _context;

    public PlantingController(dbContext context)
    {
        _context = context;
    }

    public IActionResult Index()
    {
        return View();
    }

    public IActionResult UrlDatasource([FromBody] DataManagerRequest dm)
    {
        IEnumerable DataSource = (from u in _context.Planting join c in _context.Harvest on u.CropID equals c.CropID
        select new { u.CropID, u.CropName, u.PlantDate, u.PlantQty,
        c.HarvestDate, c.Weight });           
        return dm.RequiresCounts ? Json(new { result = DataSource}) : Json(DataSource);
    }
    
}

期望输出

CropIDCropNamePlantDatePlantQtyHarvestDateWeight
03Broccoli22/05/201710005/05/20172.0
02Mango08/06/20172007/05/201710.0
06Apple02/07/20182010/05/20174.0

问题原因及解决方法

原因

查询返回的是匿名类型集合,但接收方(前端组件或数据绑定逻辑)试图将其强制转换为Planting实体类型,两者类型不匹配,导致转换异常。

解决方法

方法1:创建DTO类(推荐)

定义包含所需字段的DTO类,查询时返回该类型集合,避免匿名类型的类型转换问题:

// 定义DTO类
public class PlantingHarvestDto
{
    public string CropID { get; set; }
    public string CropName { get; set; }
    public DateTime PlantDate { get; set; }
    public int PlantQty { get; set; }
    public DateTime HarvestDate { get; set; }
    public decimal Weight { get; set; }
}

// 修改控制器方法
public IActionResult UrlDatasource([FromBody] DataManagerRequest dm)
{
    IEnumerable<PlantingHarvestDto> DataSource = (from u in _context.Planting 
                                                  join c in _context.Harvest on u.CropID equals c.CropID
                                                  select new PlantingHarvestDto 
                                                  { 
                                                      CropID = u.CropID, 
                                                      CropName = u.CropName, 
                                                      PlantDate = u.PlantDate, 
                                                      PlantQty = u.PlantQty,
                                                      HarvestDate = c.HarvestDate, 
                                                      Weight = c.Weight 
                                                  });           
    return dm.RequiresCounts ? Json(new { result = DataSource}) : Json(DataSource);
}

方法2:适配匿名类型

如果前端组件允许接收匿名类型数据,检查组件配置,确保它不会尝试将返回的JSON数据强制转换为Planting类型。此方式适合快速测试,但DTO方式更利于代码维护和类型安全。

内容的提问来源于stack exchange,提问作者Milie24

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 07:54:57