计算linq查询中的已用时间

问题描述 投票:1回答:2

在.Net Core应用程序中使用System.Linq我将尝试将AssignedDate和DateTime.Now之间的日期差异放入ElapsedTime。

var query = from r in _context.Request
    join st in _context.ServiceType on r.ServiceTypeId equals st.ServiceTypeId
    join u in _context.Users on r.AssignedUserId equals u.UserId into ju
    from u in ju.DefaultIfEmpty()
            select new RequestDto
            {
                RequestId = r.RequestId,
                UserId = r.UserId,
                //..
                AssignedUserId = r.AssignedUserId.Value,
                AssignedUser = u.Name,
                ElapsedTime = DateDiff(r.AssignedDate, DateTime.Now)
    };

DateDiff不是有效的函数。我该如何更换?

编辑:使用MicrosoftEntityFrameworkCore 2.0。尝试EntityFunction无效。

再次编辑:我可以在视图一侧用剃须刀使用这样的东西:

@if (item.AssignedDate != null){@DateTime.Compare(item.AssignedDate.Value, DateTime.Now)}

但那不起作用?

c# linq asp.net-core ef-core-2.0
2个回答
3
投票

不幸的是,即使在最近的EF Core 2.0.1中,TimeSpanDateTime在EF Core中的运营支持仍然非常完美。

例如,自然

ElapsedTime = DateTime.Now - r.AssignedDate

对于SqlServer抛出SqlException - “数据类型datetime和datetime2在减法运算符中是不兼容的。”

并尝试使用变量来欺骗它

var baseDate = DateTime.Now;

然后

ElapsedTime = baseDate - r.AssignedDate

导致另一个SqlException - “操作数数据类型datetime2对减法运算符无效。”

我能够使用w / o错误的唯一方法是DateTime.Subtract方法:

ElapsedTime = DateTime.Now.Subtract(r.AssignedDate)

但请记住,这导致client evaluation


0
投票

假设您可以更改ElapsedTime的类型,那么:

...
ElapsedTime = (DateTime.Now - r.AssignedDate).Ticks

ElapsedTime将必须是long类型,它将保持差异为ticks,当你读回来,你可以使用TimeSpan.FromTicks(ticksValue),然后你可以选择你想要的成员(小时,分钟,秒,分数等...)

© www.soinside.com 2019 - 2024. All rights reserved.