2012-04-02 59 views
2

我试图在将查询应用到IQueryable时获取项目的计数。IQueryable查询数据计数

我'试图做到这一点,如:

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

我觉得这得到跨越条件的所有数据,并采取了对象,那么它需要计数;所以我很好奇,举个例子,我只是把Id列放到列表或其他一些聪明的方式;那算数操作会更快?

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

我接受所有类型的不同想法。由于

+0

这是查询数据库吗?如果是这样,通过什么技术? LINQ2SQL? EF? – 2012-04-02 01:20:21

+0

@ChrisShain它包含在LinqToSql – 2012-04-02 01:35:46

回答

1

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

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

对不起,是不是一样?它是否更具可读性? – 2012-04-02 01:28:51

+1

@TGH是的,但如果调用只计算lambda做这项工作,为什么我想要添加的地方?感觉多余...少打字至少:) – scartag 2012-04-02 01:30:25

+0

是的我同意我错过了你的改变计数:-) – TGH 2012-04-02 01:31:05

1

如果你想这样做更快,只是不叫ToList()

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

这样,(假设它是一个SQL支持IQueryable<T>),它会执行一个查询像SELECT COUNT(*) FROM …,不SELECT * FROM …像你的方法。这个查询应该快得多。

+0

这个问题中,只要拿它的Id或它几乎一样更快? – 2012-04-02 01:26:36

+0

这可能取决于你的'IQueryable'提供者和你的数据库negine,但我怀疑它会有所作为。 – svick 2012-04-02 01:29:08

+0

好的,非常感谢 – 2012-04-02 01:30:46

0

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

+0

想象这一点的一个好方法是将它连接到db profiler。如果这是SQL Server,你可以SQL Server Profiler – TGH 2012-04-02 01:21:26