概述
首先在实现这个功能的时候想到的是在ViewModel中直接用get 属性计算。
[DisplayName("最近回访时间")]
public DateTime? LastReviewTime { get; set; }
[DisplayName("回访设定天数")]
public int Days { get; set; }
/// <summary>
/// 回访剩余天数
/// </summary>
[DisplayName("回访剩余天数")]
public int? ReviewRemainDays
{
get
{
if (LastReviewTime == null)
{
return null;
}
TimeSpan ts = DateTime.Now - LastReviewTime.Value;
return Days - ts.Days;
}
}
ReviewRemainDays,这样计算确实实现了,也能用。只是有限制,在linq语句中无论是 order by 中,还是 select 中,ReviewRemainDays都不能使用。只是在页面中可以根据查询结果列出ReviewRemainDays 的值。而我需要按ReviewRemainDays 排序。为了解决这个问题,我进行了如下改造:
var db = new DbContext();
var query = from a in db.Customer.Where(lambda)
join c in db.Intentionality on a.IntentionalityId equals c.IID
select new CustomerViewModel
{
GID = a.GID,
IID = a.IID,
//ReviewRemainDaysOrder = c.Days - (DateTime.Now - a.LastReviewTime.Value).Days,
ReviewRemainDaysOrder = c.Days - SqlFunctions.DateDiff("day", a.LastReviewTime, DateTime.Now),
};
首先在这个linq 查询中想这样用:ReviewRemainDaysOrder = c.Days - (DateTime.Now - a.LastReviewTime.Value).Days
但实际上这样用直接报了这样的错误:
DbArithmeticExpression 参数必须具有数值通用类型
知道是怎么回事,在这样的linq语句中,这种 C#中的用法不被支持。
使用了ReviewRemainDaysOrder = c.Days - SqlFunctions.DateDiff("day", a.LastReviewTime, DateTime.Now) ,经过测试,可以,但实际上这两种计算方法计算结果是有区别的。
public int? ReviewRemainDays 这个中的get 实现有时会比c.Days - SqlFunctions.DateDiff("day", a.LastReviewTime, DateTime.Now) 这种计算小一天。推测应该是 第一种使用的是timespan,这种计算精确到了毫秒级。而c.Days - SqlFunctions.DateDiff("day", a.LastReviewTime, DateTime.Now) 这个是粗粒度的计算,只是到了天这一级别。但对于我这个问题来说,只是按回访剩余天数排序,足够用了
最后
以上就是无语大门为你收集整理的如何在linq to entity中实现回访剩余天数的全部内容,希望文章能够帮你解决如何在linq to entity中实现回访剩余天数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复