2010-12-01 124 views
3

我需要对条件为真的连接结果集中的项目进行计数。因此我有一个“从何处加入”的表达类型。该表达式必须以select或groupby结尾。我实际上并不需要的列数据和算起来从而更快不要选择它:Linq-to-Sql Count

count = (from e in dc.entries select new {}).Count(); 

我有2个问题:

  1. 有一个更快的方法在DB方面要做到这一点加载?
  2. 我必须复制我的整个查询副本。有没有一种方法来构建我的查询,我可以让它有一个地方的两个计数,并获得与所有领域说一个列表?

谢谢。

请支付特别注意那枚:

  1. 查询是一个连接,而不是一个简单的表因此,我必须使用select语句。
  2. 我将需要2个不同的查询体,因为我不需要加载计数的所有实际字段,但会为列表。

我假设当我使用select查询时,它使用query.Count和Table.Count时填充数据。期待那些了解我所要求的可能更好的方法来做到这一点,并了解实际发生的情况。我需要抽出日志来深入研究。

+0

您可以将代码简化为`count = dc.entries.Count();` – 2010-12-01 16:28:47

+0

@Albin请参阅上面的内容。它不是一个表,而是一个包含连接的查询。 – 2010-12-01 19:40:50

回答

1
//you can put a where condition here  
var queryEntries = from e in dc.entries select e; 
//Get count 
queryEntries.Count(); 
//Loop through Entries, so you basically returned all entries 
foreach(entry en in queryEntries) 
{} 
+0

感谢您的建议。但是,问题是我们如何优化查询。这必须比我上面的效率要低。您正在加载的所有数据和所有字段的效率远低于SQL执行标量的效率。 – 2010-12-01 19:34:59

6

Queryable.Count

因执行表达式树 表示主叫 计数(IQueryable的) 依赖于 类型的源参数的执行的 的查询行为。预计的行为是它计算源中项目的数量 。

实际上,如果使用LinqToSql或LinqToEntities,则将Queryable.Count()发送到数据库中。没有列被加载到内存。检查生成的sql以确认。


我认为,当我使用它与数据填补了选择查询,当我使用query.Count VS Table.Count

这是不正确的。检查生成的sql以确认。


我不得不重复我的查询的完整副本。有没有一种方法来组织我的查询,我可以把它两个计数了一个地方,用于获取说,与各界

如果您同时需要计数和列表,获取列表,并指望它的列表。

如果您有时需要计数和其他时间您需要列表...编写一个返回复杂IQueryable的方法,有时会调用.Count()和其他时间调用.ToList();


我实际上并不需要的列数据和算起来以便更快地不选择它。

这在您的情况下基本上是错误的。在索引覆盖结果列的情况下,您可能会遇到这种情况,但您没有任何结果列。

在您的场景中,无论查询优化器选择了哪个索引,都可以使用该索引进行计数。

总结:查询优化器将执行您所期望的优化。