【发布时间】:2020-11-28 20:55:54
【问题描述】:
我正在开发一个 web api 项目。我正在使用依赖注入,所以我在ProductRepository 类中创建了我所有的方法。具体public IQueryable<Product> GetTwoWithLowestPrice()方法。
我需要实现的是从数据库中返回 2 个价格最低的产品。
我试图从数据库中获取所有产品并升序排序,这意味着2个价格最低的产品将在开头 这个sorted 列表。因此,我将 index 位置 0 和 1(前两个)上的产品添加到我的 retVal 列表中......我可能不允许如此轻松地将列表投射到不同的集合中而不会丢失数据(我不熟悉每个集合在那里)。代码:
public IQueryable<Product> GetTwoWithLowestPrice()
{
List<Product> retVal = new List<Product>();
var sorted = db.Products.Include(p => p.Category).OrderBy(p => p.Price);
var list = sorted as List<Product>;
retVal.Add(list[0]);
retVal.Add(list[1]);
return retVal as IQueryable<Product>;
}
这会引发异常
('Object reference not set to an instance of an object.' list was null.)
【问题讨论】:
-
虽然您的思维过程最初可能会起作用(从数据库中获取记录,然后将它们排序以获得最低价格),但如果您将来有大量产品,您可能不得不返回并排序一个大型数据集。使用数据库查询检索两个最低价格几乎总是更有效。
-
@Leroy 我想到了这一点,但我正在寻找一种替代/更快的方式(使用 EntitiyFramework)。但无论如何,你会怎么做呢?使用
string查询、SqlDataReader和SqlCommand?到目前为止,这是我从数据库中获取数据的唯一方法。 -
这个问题的答案取决于您选择的数据库,因为 SQL 查询会因此而改变。一个简单的例子是:
SELECT TOP 2 product FROM products ORDER BY price ASC当然,上面的 SQL 表/字段名称应该更改以匹配您的数据库包含的内容。 -
@Leroy 明白了。虽然我需要知道这是否可以使用 EntityFramework 以某种方式完成
-
使用 Take 和 ToList。但总的来说:尝试了解您在做什么,而不是反复试验。
标签: database entity-framework methods repository