在linq中选择Count(Id)

时间:2015-11-18 13:37:17

标签: c# linq

有没有办法编写linq查询来导致:

select Count(Id) from tbl1

因为

tbl1.Select(q=>q.Id).Count()

没有翻译成我想要的结果

更新:

它返回:

select count(*) from tbl1

回答后更新:

我测试了超过21,000,000的场景

execution plan

record counts

4 个答案:

答案 0 :(得分:5)

在sql中使用count(field)计算所有非空值。在linq中,您可以说:

tbl1.Where(q => q.Id != null).Count();

或简单地说:

tbl1.Count(q => q.Id != null);

答案 1 :(得分:5)

  

有没有办法写一个linq查询来导致。

没有。第一件事就是在T-SQL中填写您需要的内容,您可以使用:

  • COUNT(*)将计算表格中的行数
  • COUNT(column)将计算列中的条目 - 忽略空值。

如果您需要计算您拥有的行数,请使用

var total = tbl1.Count();

如果您需要查看特定列不为空的实体数量,请使用Count方法的过滤器重载。

var total = tbl1.Count(x => x.Id != null);

不,这是不可能的。使用Count(*)或'Count(Id), even more if your Id`作为主键,性能没有差异。

我做了一个带有超过一百万个元组的表的实验。查看两个查询的执行计划。第一个是select count(*),第二个是select count(id)id是主键(抱歉结果在葡萄牙语 - 巴西):

enter image description here

答案 2 :(得分:1)

获得的可能性

  

从tbl1

中选择Count(Id)

将是

tbl1.Where(q => q.Id != null).Select(x => x.Id).Distinct().Count();

以上Where可以避免null值。如果您还希望对它们进行计数,则需要删除Where并调整Select以处理null条目。

此外,如果您不想仅计算不同的值,则可以忽略SelectDistinct部分。

答案 3 :(得分:1)

为了执行与SQL Count(Id)相同的功能,您可以使用LINQ GroupBy,然后评估每个组。这是一个简短的完整片段:

using System;
using System.Collections.Generic;
using System.Linq;

namespace CrashTest
{
    class Program
    {
        public static void Main()
        {
            List<MyObj> objs = new List<MyObj>
            {
                new MyObj{Id = 1, MyType = "toto"},
                new MyObj{Id = 1, MyType = "tata"},
                new MyObj{Id = 1, MyType = "tutu"},
                new MyObj{Id = 1, MyType = "titi"},
                new MyObj{Id = 2, MyType = "toto"},
                new MyObj{Id = 2, MyType = "tata"},
            };
            var g = objs.GroupBy(i => i.Id);
            foreach (var group in g)
            {
                Console.Out.WriteLine("There is " +  group.Count() + " objs of ID:" + group.Key);
            }
            Console.Out.WriteLine("There is " + g.Count() + " different ids"); 
        }
    }

    public class MyObj
    {
        public int Id { get; set; }
        public string MyType { get; set; }
    }
}

将输出:

There is 4 objs of ID:1
There is 2 objs of ID:2
There is 2 different ids