有没有办法编写linq查询来导致:
select Count(Id) from tbl1
因为
tbl1.Select(q=>q.Id).Count()
没有翻译成我想要的结果
更新:
它返回:
select count(*) from tbl1
回答后更新:
我测试了超过21,000,000的场景
答案 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
是主键(抱歉结果在葡萄牙语 - 巴西):
答案 2 :(得分:1)
获得的可能性
从tbl1
中选择Count(Id)
将是
tbl1.Where(q => q.Id != null).Select(x => x.Id).Distinct().Count();
以上Where
可以避免null
值。如果您还希望对它们进行计数,则需要删除Where
并调整Select
以处理null
条目。
此外,如果您不想仅计算不同的值,则可以忽略Select
和Distinct
部分。
答案 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