.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 查询中的sd
和 ed
?
在您的 Linq 语句中,您只需要按日期分组以获得相同的查询。在我的脑海中,我认为group by t.PlanDate.Date into grouping
会起作用。
只是一个旁注:而不是 dateadd(day, 0, datediff(day, 0, Plandate)) convert(date,Plandate) 怎么样?
@ozzmhmt 尝试将您的日期比较更改为(t.PlanDate >= sd && t.PlanDate <= ed)
【参考方案1】:
"db.Task.SqlQuery()" 返回任务集合。但是您的查询选择了另一列:“作为计数的数字和创建的日期时间”。你有两个解决方案
1- 根据您的 EF 版本,您可以使用 DbContext.Database.SqlQuery() 或类似的东西。 2- 在数据库中创建一个视图并在 dbcontext 的“OnModelCreating”方法中映射到 EF 实体模型:
modelBuilder.Entity<ViewModel>(eb =>
eb.HasNoKey();
eb.ToView("ViewName");
);
【讨论】:
以上是关于.Net 原始字符串查询的主要内容,如果未能解决你的问题,请参考以下文章