Linq 2 Sql - 除非在控制器内完成查询,否则存储库不起作用
本文关键字:查询 不起作用 存储 Sql 控制器 Linq | 更新日期: 2023-09-27 17:56:54
我真的很难理解我面临的问题。 我有一个非常简单的存储库,其中包含以下代码:
public class ProductRepository : IProductRepository
{
private Table<Product> productTable;
public Product GetProductById(int id)
{
return productTable.Where(p => p.ProductId == id).Single();
}
public IQueryable<Product> GetProducts()
{
return productTable;
}
}
我有一个名为AddToCart()的控制器。 上面的存储库类通过 DI 传递到控制器中。 我将 productId 传递到此控制器中,并调用存储库方法。 问题是当产品确实存在时,返回空值。
public void AddToCart(int productId)
{
//Returns Null value
Product product = productRepository.GetProductById(productId);
...
}
我认为问题可能是我需要在我返回的班级周围IQueryable<>
。 我还以各种方式修改了我的 AddToCart 方法,以尝试使其正常工作。
public IQueryable<Product> GetProductById(int id)
{
return productTable.Where(p => p.ProductId == id);
}
public void AddToCart(int productId)
{
//Throws error / Returns Null value
Product product = productRepository.GetProductById(productId).Single();
//Returns Null value
Product product = productRepository.GetProductById(productId).FirstOrDefault();
}
但是,以下作品,我没有理由! 它基本上是相同的代码,只是在控制器中完成。 有人有什么想法吗?:/
public void AddToCart(int productId)
{
Product product = productRepository.GetProducts().FirstOrDefault(p => p.ProductId == productId);
}
我想知道您的依赖注入是否有问题。您正在使用 .Single() 根据文档,如果集合中没有满足您条件的项目,它将引发异常。
我会尝试在不使用依赖注入的情况下实现这一点,看看你是否得到相同的结果。您还可以尝试直接从 GetProductById 方法(而不是从数据库中提取)实例化和返回产品项,以排除 DI 发生的任何奇怪情况。
如果没有更多信息,很难看出问题是什么。
- GetProductById() 如何返回 null?Single() 不允许返回空值,如果没有项目或返回多个项目,则会抛出 InvalidOperationException。
- GetProducts() 有什么不同之处?查看您的代码,应该没有任何问题。
当你尝试这个时会发生什么?
public class ProductRepository : IProductRepository
{
private Table<Product> productTable;
public Product GetProductById(int id) {
return GetProducts().Where(p => p.ProductId == id).Single();
}
public IQueryable<Product> GetProducts() {
return productTable;
}
}
作为旁注,如果您确信集合中仅存在一个项目,则应避免使用 Single()。单曲将始终贯穿您的整个收藏。First() 在这方面更有效率。