Linq to sql Linq到Sql计数

Linq to sql Linq到Sql计数,linq-to-sql,Linq To Sql,我需要对条件为true的联接结果集中的项进行计数。因此,我有一个“fromjoinwhere”类型的表达式。此表达式必须以select或groupby结尾。我实际上不需要列数据,因此不选择它会更快: count = (from e in dc.entries select new {}).Count(); 我有两个问题: 在db负载方面有没有更快的方法 我必须复制查询的整个副本。有没有一种方法可以构造我的查询,让它在一个地方同时进行计数和获取一个包含所有字段的列表 谢谢 请特别注意: 查询是一

我需要对条件为true的联接结果集中的项进行计数。因此,我有一个“fromjoinwhere”类型的表达式。此表达式必须以select或groupby结尾。我实际上不需要列数据,因此不选择它会更快:

count = (from e in dc.entries select new {}).Count();
我有两个问题:

  • 在db负载方面有没有更快的方法
  • 我必须复制查询的整个副本。有没有一种方法可以构造我的查询,让它在一个地方同时进行计数和获取一个包含所有字段的列表
  • 谢谢

    请特别注意:

  • 查询是一个连接,而不是一个简单的表,因此我必须使用select语句
  • 我需要两个不同的查询主体,因为我不需要为计数加载所有实际字段,但会为列表加载
  • 我假设当我使用select查询时,当我使用query.Count vs Table.Count时,它正在填充数据。期待那些了解我所要求的更好的方法的人,以及一些关于实际发生情况的详细知识。我需要拉出日志来更深入地了解这一点。

    //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)
    {}
    
    作为查询对象发生的查询行为 执行表达式树的结果 那代表着召唤 计数(IQueryable) 取决于该计划的实施 源参数的类型。这个 预期的行为是它的价值 源中的项目数

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


    我假设当我使用select查询时,当我使用query.Count vs Table.Count时,它正在填充数据

    事实并非如此。检查生成的sql以确认


    我必须复制查询的整个副本。有没有一种方法可以构造我的查询,让它在一个地方同时进行计数和获取一个包含所有字段的列表

    如果您需要计数和列表,请获取列表并进行计数

    如果你有时需要计数,有时需要列表。。。编写一个返回复杂IQueryable的方法,有时调用.Count(),有时调用.ToList()


    我实际上不需要列数据,因此不选择它会更快

    在您的场景中,这基本上是错误的。在索引覆盖结果列,但没有任何结果列的情况下,这可能是真的

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


    总结:查询优化器将执行您想要的优化。

    您可以将代码简化为
    count=dc.entries.count()@Albin请参见我的上文。这不是一个表,而是一个包含连接的查询。谢谢你的建议。但是,问题是我们如何优化查询。这比我上面提到的效率要低。您正在加载所有数据和所有字段,这比让SQL执行标量效率要低得多。我再次查看了您的代码,虽然我可以使用Count()方法不复制我的代码,但它仍然会加载所有条目(我相信)。这就是我需要澄清的事实。谢谢你的回答。当我在调试器中查看时,它显示了所有条目。这是因为调试器视图吗?还有一件事,我的列表需要一个loadswith,而我的计数不需要,因此我猜查询优化器无法处理这一点,这表明需要两个例程。我会在有时间时检查这一点。但是,我还没有时间详细探讨这个问题。您在调试器中悬停的是什么?这是不是在张贴的代码中没有的东西?您可能希望使用它来查看发布到数据库的实际sql:DataContext.Log=Console.Out;