C# EF Core两表join联表查询如何正确返回List<cartItem>结果
问题原因
这段代码报错的核心是类型不匹配:
- 方法签名明确约定返回
List<cartItem>类型 - 但LINQ查询中
select new { ... }语法生成的是匿名类型集合,这种类型是编译器自动生成的临时类型,和cartItem没有继承/类型转换关系,直接返回必然触发类型错误。
修复方案
方案1:直接投影为cartItem实例(改动最小)
如果你的cartItem类中已经定义了proName、qty、proImg、uPricce(注意这里拼写存在笔误,常规命名为uPrice,请和你自己类中的实际属性名对齐)这些属性,只需要把select部分的匿名类型替换为cartItem实例初始化即可,修改后代码如下:
public List<cartItem> getcartItem(int userId) { var data = (from c in _context.cartItems join p in _context.Products on c.productId equals p.ProId where c.userId == userId && c.status == false select new cartItem { // 等号左侧属性名必须和cartItem类中定义的属性名完全一致 proName = p.ProductName, qty = c.quantity, proImg = p.ImageUrl, uPricce = p.price }).ToList(); return data; }
方案2:定义专用DTO返回关联查询结果
如果原始cartItem是和数据库表直接映射的实体类,类本身没有这些关联查询出的商品字段,不要强行给数据库实体加非表字段,建议单独定义购物车项传输类:
// 专门用于返回联表查询结果的类 public class CartItemDto { public string proName { get; set; } public int qty { get; set; } public string proImg { get; set; } public decimal uPrice { get; set; } // 修正了原代码的拼写错误 }
之后把方法返回类型改成List<CartItemDto>,select部分投影为CartItemDto实例即可。
注意:匿名类型只能在当前方法内部使用,不能作为方法返回值跨作用域传递,需要对外返回的结构化数据,必须显式定义对应的实体类。
内容的提问来源于stack exchange,提问作者Malshan Hansaka
相关产品推荐
相关产品推荐

