【问题标题】:IQueryable queried data countIQueryable 查询数据计数
【发布时间】:2012-04-02 01:16:37
【问题描述】:

当我将查询应用于 IQueryable 时,我正在尝试获取项目的计数。

我正在尝试这样做:

this.lblSth.Text = new Repository<Sth>().GetAll().Where(p => p.PersonId == personId).ToList().Count().ToString();

我认为这会获取条件中的所有数据并获取对象,然后进行计数;所以我很好奇,例如,我是否只是将 Id 列转换为列表或其他一些聪明的方式;那计数操作会更快吗?

Info: GetAll() => 这是一个存储库模式方法,从 linqToSql 数据实体返回 IQueryable 对象 T。

我对所有类型的不同想法持开放态度。谢谢

【问题讨论】:

  • 这是在查询数据库吗?如果是这样,通过什么技术? LINQ2SQL?英孚?
  • @ChrisShain 它包含在它是 LinqToSql 的问题中

标签: c# count iqueryable


【解决方案1】:

我认为对 Where 和 ToList 的调用是多余的。 见下文。

this.lblSth.Text = new Repository<Sth>().GetAll().Count(p => p.PersonId == personId).ToString();

【讨论】:

  • @TGH 是的,但如果只调用算作 lambda 来完成这项工作,我为什么要添加 where 呢?感觉多余……至少打字少了:)
  • 是的,我同意我错过了您对 Count 的更改 :-)
【解决方案2】:

如果您想更快地完成此操作,请不要致电ToList()

this.lblSth.Text = new Repository<Sth>().GetAll()
                                        .Where(p => p.PersonId == personId)
                                        .Count()
                                        .ToString();

这样,(假设它是 SQL 支持的 IQueryable&lt;T&gt;)它将执行类似 SELECT COUNT(*) FROM … 的查询,而不是像您的方法那样执行 SELECT * FROM …。而且这个查询应该快得多。

【讨论】:

  • 好吧,是直接取 ID 比较快还是差不多?
  • 这可能取决于您的IQueryable 提供商和您的数据库negine,但我怀疑它会有所作为。
【解决方案3】:

ToList() 将执行查询并将您的 IQUeryable 转换为 IEnumerable。我会调用 where 子句的计数。这样 Count 将成为最终查询的一部分

【讨论】:

  • 可视化的一个好方法是将其连接到 db profiler。如果这是 SQL Server,您可以使用 SQL Server 分析器
猜你喜欢
  • 1970-01-01
  • 2015-10-31
  • 2017-06-21
  • 1970-01-01
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多