【问题标题】:Convert SQL query into LINQ - DateDiff function将 SQL 查询转换为 LINQ - DateDiff 函数
【发布时间】:2016-03-09 09:12:58
【问题描述】:

我的任务是使用 Groupby、Orderby、Date 函数将以下 SQL 查询转换为 LINQ。

SELECT 
       sd.name, s.BuilderName,
       Min(Date) as MinDatetime, 
       Max(Date) as MaxDatetime, 
       datediff(day, min(Date), max(Date))/ cast (count(sd.jobRobosname) as float) 
FROM 
       [Data] sd  
JOIN Example s ON s.name= sd.Name
WHERE jobRobosjobid='NOT RUN' 
GROUP  BY sd.name, s.name

我试过了,

(from record in _db.Data                              
join jobRobos in _db.Example on record.Name equals Example.Name
where record.jobRobos jobid != "NOT RUN"
  group jobRobos by new {record.Name,jobRobos .BuilderName} into r
select new
{
    jobRobos Name = r.Key.jobRobos Name,
    BuilderName = r.Key.BuilderName,
    MaxDate = r.Key.Min(r.Date),
    MinDate = r.Max(c => c.Date),
    Diff = r.Key.datediff(day, MinDate, MaxDate) / r.Key.Cast(Count(r.Key.jobRobos Name) as float)
}).ToList();

我在这里提到了一些类似的问题,例如:

但找不到解决方案。

谁能给我一些建议?

【问题讨论】:

  • 您能说明您遇到的错误吗?
  • 将错误文本声明为AnanymousType Error
  • 您已经为 mySQL 和 SQL Server 添加了标签。你用的是哪个?如果是后者,那么您可以使用SqlMethods.DateDiffDay - 请参阅MSDN
  • 你的sql有错误..因为你不能使用sd.spidername ..它不在groupby子句中
  • 对所有此类问题的标准评论:LINQ 不是 SQL,并且像这样使用它是一种主要的气味。它不是 SQL 的替代品,L2S 或 EF 也不是。 ORM 应该将实体映射 到表,而不是作为 SQL 的替代品。创建适当的实体和映射并使用LINQ查询实体。报告式查询根本不应该涉及 ORM,因为不涉及任何对象/实体

标签: c# sql-server vb.net linq


【解决方案1】:

对于 EF 6,这应该可以使用 DbFunctions.DiffDays:

(from record in _db.Data                              
join spider in _db.Example on record.Name equals Example.Name
where record.spiderjobid != "NOT RUN"
  group spider by new {record.Name,spider.BuilderName} into r
select new
{
    Name = r.Key.Name,
    BuilderName = r.Key.BuilderName,
    MaxDate = r.Max(d => d.Date),
    MinDate = r.Min(d => d.Date),
    Diff = DbFunctions.DiffDays(r.Max(d => d.Date), r.Min(d => d.Date)) / r.Count(d => d.SpiderName)
}).ToList();

【讨论】:

  • 这里的 Diff 值必须是 Float 。那么演员应该需要吧?
  • 是的,重点。但是,转换为 float 可能会导致 LINQ to Entities 错误。如果是这样,那么只需将DateDiffCount 分别带回,然后作为将从SQL 带回的匿名类型映射到模型的一部分进行强制转换。
  • 我不确定我是否理解。确切的错误是什么?
猜你喜欢
  • 2013-12-13
  • 2014-08-14
  • 1970-01-01
  • 1970-01-01
  • 2012-02-17
  • 2017-02-23
  • 2020-07-19
  • 1970-01-01
相关资源
最近更新 更多