如何通过LINQ从数据库进行计数以及在何处

时间:2019-06-17 11:24:13

标签: c# .net linq .net-core entity-framework-core

我有问题。我想使我的应用程序更快。我的问题是:

_context.Products.Where(m => m.Name.Contains(part)).Take(20);

我不想拿整个收藏,我只想拿一部分。我要接受元素,直到有足够满足我条件的元素为止,并且我不会遍历整个集合来得出结果。我可以使用标准的LINQ和EF Core方法得到它吗?

2 个答案:

答案 0 :(得分:1)

通常是。在调用ToList方法或开始对此集合进行迭代之前,所有LINQ和EF方法都将转换为SQL。它的工作原理有点像查询生成器,在这种情况下,迭代是执行查询的触发器。请阅读有关IQueryable接口的信息。

例如,上面的代码将被转换为“ SELECT TOP 20 * FROM Products WHERE”

答案 1 :(得分:0)

下面我的答案是基于这样的假设:您希望分块获取数据,而不是一次获取整个集合以使应用程序运行更快。

  

“我不想参加整个收藏,我只想参加一部分   其中。”

您需要同时使用Skip和Take方法。

例如,您可以假定静态页面大小,例如在您的情况下为20。 然后,在查询结果时,您需要指定要获取数据的页面索引。要获取查询结果中有多少页,您可以首先对记录进行计数,并将其存储在客户端/内存/缓存中的某个位置。

return _context.Products.Where(m => m.Name.Contains(part)).Count(); // to get the total number of records e.g. 74

然后要获取数据块,您可以指定页面大小和页面索引。

_context.Products.Where(m => m.Name.Contains(part)).Skip(PAGE_INDEX*PAGE_SIZE).Take(PAGE_SIZE);

PAGE_INDEX和PAGE_SIZE是您的函数的输入参数。