如何从FromSql获取计数?

时间:2018-11-06 20:14:38

标签: c# sql-server entity-framework-core ef-core-2.1

我有

dbContext.Items.FromSql("SELECT COUNT(*) 
                         FROM Items 
                         WHERE JSON_VALUE(Column, '$.json') = 'abc'")

这返回一个IQueryable,我想知道如何返回标量int吗?

6 个答案:

答案 0 :(得分:2)

尝试

 var firstElement = dbContext.Items
                             .FromSql (..)
                             .ToList
                             .First();

答案 1 :(得分:1)

最快的破解/解决方法是,如果您的Item类具有int / long属性(让我们说Id),则可以这样处理:

   dbContext.Items.FromSql("SELECT COUNT(*) as Id
                     FROM Items 
                     WHERE JSON_VALUE(Column, '$.json') = 'abc'").Select(x=>x.Id).First();

答案 2 :(得分:0)

您可以执行以下操作: dbContext.Items.Count()

您始终可以在IQueryable上执行.Count()函数

编辑: 当确实需要FromSql时,应该执行以下操作:

var count = context.Items.FromSql("Select count(*) from items").First();

答案 3 :(得分:0)

FromSQL有一些限制:

  • SQL查询必须返回实体或查询类型的所有属性的数据。

因此,请尝试以下操作:

var elements = dbContext.Items
                         .FromSql("SELECT * from dbo.Items")
                         .ToList();

var countOfElements = elements.Count();

答案 4 :(得分:0)

您应将 composable SELECT SQL传递给FromSql方法,例如SELECT *-参见Raw SQL Queries。然后,您可以应用常规的LINQ Queryable运算符,包括Count

var count = dbContext.Items
    .FromSql("select * FROM Items Where JSON_VALUE(Column, '$.json') = 'abc'")
    .Count();

答案 5 :(得分:0)

截至EF Core 3.1,2020年

var count = dbContext.Set.FromSqlRaw(/* {raw SQL} */).Count();  

将生成以下SQL

SELECT COUNT(*)::INT
FROM (
    -- {raw SQL}
) AS c

其中{raw SQL}的格式为

select count(*) from my_table where my_col_condition = true group by my_col_id

这样就可以在数据库端完美地完成计数工作,而无需在客户端上加载表行。
请注意不要以{raw SQL}结尾;