【问题标题】:Select calculated field选择计算字段
【发布时间】:2013-02-27 06:11:48
【问题描述】:

如何选择持续时间作为实体框架中两个字段之间的差异。以下是对应的SQL查询:

SELECT InitiateTime, StartTime, EndTime, Ano,Bno,  datediff(s,StartTime,EndTime) as duration
FROM [NEPALIVR2].[dbo].[CDR]
WHERE StartTime >= startDate and StartTime <= endDate order by StartTime desc

LINQ

from u in db.CDRs 
where u.InitiateTime >= startDate && u.InitiateTime <= endDate 
orderby u.InitiateTime descending 
select new
{
   InitiateTime = u.InitiateTime,
   StartTime = u.StartTime,
   EndTime = u.StartTime,
   Ano = u.Ano,
   Bno = u.Bno,
   Duration = (SqlFunctions.DateDiff("mi", u.StartTime, u.EndTime))/360,
};

这会返回错误:

无法将类型 'System.Linq.IQueryable&lt;AnonymousType#1&gt;' 隐式转换为 'System.Linq.IQueryable&lt;IVRControlPanel.Models.CDR&gt;'。存在显式转换(您是否缺少演员表?)

【问题讨论】:

    标签: c# linq entity-framework compiler-errors linq-to-entities


    【解决方案1】:

    看起来您的问题不是差异计算,而是您从查询返回的匿名类型。将其更改为CDR 对象:

    select new CDR
    {
       InitiateTime = u.InitiateTime,
       StartTime = u.StartTime,
       EndTime = u.StartTime,
       Ano = u.Ano,
       Bno = u.Bno,
       Duration = SqlFunctions.DateDiff("mi", u.StartTime, u.EndTime)/360
    });
    

    【讨论】:

    • 如果我创建了新的 CDR 那么错误是no definition of Duration in CDR
    • @CodeManiac 您是使用 CodeFirst,还是映射到现有数据库?
    • @CodeManiac 好吧,实体是作为部分类生成的。使用 Duration 属性创建部分 CDR 类。那会成功的。顺便说一句,您还可以将持续时间计算移至该属性。只需确保您的部分 CDR 类定义在与生成的 CDR 相同的命名空间中
    猜你喜欢
    • 1970-01-01
    • 2023-02-23
    • 2021-08-27
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 2015-09-16
    • 2013-06-22
    • 1970-01-01
    相关资源
    最近更新 更多