首先在实现这个功能的时候想到的是在ViewModel中直接用get 属性计算。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20[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 排序。为了解决这个问题,我进行了如下改造:
1
2
3
4
5
6
7
8
9
10
11var 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内容请搜索靠谱客的其他文章。
发表评论 取消回复