我是靠谱客的博主 无语大门,最近开发中收集的这篇文章主要介绍如何在linq to entity中实现回访剩余天数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

首先在实现这个功能的时候想到的是在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中实现回访剩余天数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部