【问题标题】:How to take count from DB by LINQ and where如何通过 LINQ 从 DB 中计数以及在哪里
【发布时间】:2019-06-17 11:24:13
【问题描述】:

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

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

我不想拿走整个收藏品,我只想拿走其中的一部分。我想取元素,直到我有足够的元素满足我的条件,并且我不会遍历我的整个集合来得到我的结果。我可以使用标准 LINQ 和 EF Core 方法来实现吗?

【问题讨论】:

  • 你试过了吗?我相信.Take(20) LINQ 的一部分将转换为LIMIT 20 SQL 语句。
  • 大部分是的。在您调用 ToList 或开始对此集合进行交互之前,所有 LINQ 和 EF 方法都将转换为 SQL。请阅读 IQueryable 接口。例如上面的代码将被转换为 SELECT TOP 20 * FROM Products WHERE
  • @Wokuo,那么,上下文它就像一个请求的构建器?
  • @ВиталийЗаярний,不,这就像构建查询
  • @Виталий Заярний 简化是的,它是某种查询构建器

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


【解决方案1】:

大部分是的。在您调用 ToList 方法或开始迭代此集合之前,所有 LINQ 和 EF 方法都将转换为 SQL。它的工作方式有点像查询构建器,在这种情况下,迭代是执行查询的触发器。请阅读 IQueryable 接口。

例如上面的代码将被转换成'SELECT TOP 20 * FROM Products WHERE'

【讨论】:

    【解决方案2】:

    以下我的回答是基于您希望以块的形式获取数据而不是一次获取整个集合以使您的应用程序运行得更快的假设。

    “我不想拿整个收藏,我只想拿一部分 。”

    您需要同时使用 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 是函数的输入参数。

    【讨论】:

      猜你喜欢
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      • 2016-08-23
      • 1970-01-01
      • 1970-01-01
      • 2019-03-28
      • 2011-09-04
      • 2023-04-02
      相关资源
      最近更新 更多