.Net 原始字符串查询

Posted

技术标签:

【中文标题】.Net 原始字符串查询【英文标题】:.Net Raw String Query 【发布时间】:2021-10-07 22:31:55 【问题描述】:

我正在使用实体框架开发一个 .NET Wep API 项目。我无法为此 SQL 代码编写带有实体的查询:

select 
    count(*) as total, 
    dateadd(day, 0, datediff(day, 0, Plandate)) as created
from 
    Task 
where 
    AssignedUserId = 3 
    and (PlanDate between '2021-07-01' and '2021-07-31 23:59')
group by 
    dateadd(day, 0, datediff(day, 0, PlanDate))

这是我使用原始查询编写它的方式:

var a = db.Task.SqlQuery("select count(*) as total, DATEADD(DAY,0, datediff(day,0,Plandate)) as created from Task where AssignedUserId = 3 and(PlanDate between '2021-07- 01' and '2021-07-31 23:59') group by dateadd(DAY, 0, datediff(day, 0, PlanDate))").ToList();

但我收到此错误:

System.Data.Entity.Core.EntityCommandExecutionException: '数据读取器与指定的 'CRMSFAData.Model.Task' 不兼容。类型的成员“id”在数据读取器中没有同名的对应列。'

我尝试用实体写:

var query = from t in db.Task
            where (t.AssignedUserId == userId && (t.PlanDate <= sd && t.PlanDate >= ed))
            group t by new  t.PlanDate  into grouping
            select new
                
                    c = grouping.Count(),
                    grouping.Key.PlanDate
                ;

return query.ToList();

这会返回一个空的结果集。

还有其他实体查询或原始查询的解决方案吗?你能帮帮我吗?

【问题讨论】:

"但我收到此错误:" - The SQL query must return data for all properties of the entity type. 还有什么是 LINQ 查询中的 sded 在您的 Linq 语句中,您只需要按日期分组以获得相同的查询。在我的脑海中,我认为group by t.PlanDate.Date into grouping 会起作用。 只是一个旁注:而不是 dateadd(day, 0, datediff(day, 0, Plandate)) convert(date,Plandate) 怎么样? @ozzmhmt 尝试将您的日期比较更改为(t.PlanDate &gt;= sd &amp;&amp; t.PlanDate &lt;= ed) 【参考方案1】:

"db.Task.SqlQuery()" 返回任务集合。但是您的查询选择了另一列:“作为计数的数字和创建的日期时间”。你有两个解决方案

1- 根据您的 EF 版本,您可以使用 DbContext.Database.SqlQuery() 或类似的东西。 2- 在数据库中创建一个视图并在 dbcontext 的“OnModelCreating”方法中映射到 EF 实体模型:

 modelBuilder.Entity<ViewModel>(eb =>
                       
                           eb.HasNoKey();
                           eb.ToView("ViewName");
                       );

【讨论】:

以上是关于.Net 原始字符串查询的主要内容,如果未能解决你的问题,请参考以下文章

从 PDO 准备好的语句中获取原始 SQL 查询字符串

截断查询字符串并返回干净的 URL C# ASP.net

如何让查询生成器将其原始 SQL 查询输出为字符串?

如何让查询生成器将其原始 SQL 查询输出为字符串?

在执行查询之前,如何从 Laravel 的查询构建器中获取原始查询字符串?

django 中的分页 - 原始查询字符串丢失