在Entity Framework中选择单个虚拟行

时间:2018-02-02 18:27:28

标签: c# entity-framework

我试图在实体框架中做这样的事情。

    SELECT (SELECT COUNT(*) FROM Log Where LogTypeId =1) as Log1, 
           (SELECT COUNT(*)  FROM Log Where LogTypeId =2) as Log2

注意缺少来自。本质上,我只想选择包含Log表聚合的单行。我试过这样的事情。

(from x in ctx.Logs
select new {
Log1 = ctx.Logs.Count((x) => x.LogTypeId == 1),
Log2 = ctx.Logs.Count((x) => x.LogTypeId == 2)
}).First();

但是,如果ctx.Logs不包含任何行(新系统或最近存档的行),则返回null。虽然没有那么难以检查空回报并且只是创建一个空白条目,但我想知道是否有办法处理它所以我不必做"如果null创建一个空白聚合,所有字段都设置为0"我想在哪里创建这个查询(因为我会在多个地方有几种类似的选择方式)。

我还想避免多次选择,以防止多次往返数据库。

2 个答案:

答案 0 :(得分:0)

好的,感觉有点傻,并想出我可以使用DefaultIfEmpty

(from x in ctx.Logs.DefaultIfEmpty()
select new {
Log1 = ctx.Logs.Count((x) => x.LogTypeId == 1),
Log2 = ctx.Logs.Count((x) => x.LogTypeId == 2)
}).First();

答案 1 :(得分:0)

要避免空值,您需要在空处理函数上使用一个:

!。nvl

https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions105.htm

2.nvl2

https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions106.htm

3.coalesce

https://docs.oracle.com/cd/B28359_01/server.111/b28286/functions023.htm#SQLRF00617

使用方法: NVL(yourcolumn,0) 在您的代码或谷歌中尝试这些功能我希望您能从我这边得到一些帮助。