我有问题。我想使我的应用程序更快。我的问题是:
_context.Products.Where(m => m.Name.Contains(part)).Take(20);
我不想拿整个收藏,我只想拿一部分。我要接受元素,直到有足够满足我条件的元素为止,并且我不会遍历整个集合来得出结果。我可以使用标准的LINQ和EF Core方法得到它吗?
答案 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是您的函数的输入参数。