LINQ查询本应返回单个Product却返回集合的问题求助
问题描述
我有一个展示产品列表的页面,每行设有查看按钮,用户点击后可查看对应产品的详情。按钮会传递产品ID,用于查询数据库中唯一的产品记录(产品ID具有唯一性)。
尝试的错误代码
业务逻辑层代码
private void ViewProductDetails(int id) { product = productService.GetProductID(id); ViewProductPopup = true; }
数据访问层代码
public Product GetProductByID(int id) { using (var context = _dbContextFactory.CreateDbContext()) { return context.Products .Where(x => x.ProductId == id); } }
报错信息
Cannot implicilty convert type system.linq.iquertable<app.models.product> to app.models.product. An explicit conversion exists (are you missing cast?)
临时解决方案(不符合需求)
业务逻辑层代码
private void ViewProductDetails(int id) { productList = productService.GetProductID(id); selectedProduct = productList[0]; ViewProductPopup = true; }
数据访问层代码
public List<Product> GetProductByID(int id) { using (var context = _dbContextFactory.CreateDbContext()) { return context.Products .Where(x => x.ProductId == id) .ToList(); } }
模型代码
public partial class ProductFinderContext : DbContext { public ProductFinderContext () { } public ProductFinderContext (DbContextOptions<ProductFinderContext > options) : base(options) { } public virtual DbSet<Product> Products{ get; set; } }
请问这是问题的根源吗?
解决方案
问题不在你的DbContext模型代码里,根源是数据访问层的查询方法返回值类型不匹配:
Where方法返回的是IQueryable<Product>(可查询集合),但方法声明要返回单个Product对象,因此类型转换失败。- 既然产品ID是唯一的,直接使用EF Core提供的单条记录查询方法即可:
修改数据访问层的GetProductByID方法:
public Product GetProductByID(int id) { using (var context = _dbContextFactory.CreateDbContext()) { // 产品ID唯一,用SingleOrDefault更严谨:找不到返回null,找到多条会抛异常 return context.Products .SingleOrDefault(x => x.ProductId == id); } }
对应的业务逻辑层代码改回最初版本即可:
private void ViewProductDetails(int id) { product = productService.GetProductByID(id); ViewProductPopup = true; }
方法说明
SingleOrDefault:适用于确定匹配记录最多一条的场景,符合产品ID唯一的业务规则,能及时发现ID重复的异常情况。FirstOrDefault:找到第一条匹配记录就返回,找不到返回null,即使有多条也不会报错,适合ID可能不唯一的场景,但你的业务用SingleOrDefault更合适。
内容的提问来源于stack exchange,提问作者Lisa
相关产品推荐
相关产品推荐

