项目架构是EF+Linq+SqlServer 2008,现在遇到了一个“热点信息”的需求,要求按照下面代码里的算法来排序,各位谁能帮个忙,这个用Linq该怎么写? public class Info
{
/// <summary>
/// ID
/// </summary>
public int ID { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreateTime { get; set; }
/// <summary>
/// 阅读次数
/// </summary>
public int ViewTimes { get; set; }
/// <summary>
/// 分类ID
/// </summary>
public int ColumnID { get; set; }
/// <summary>
/// 状态
/// </summary>
public int StateID { get; set; }
}
public class InfoBusiService : AbstractBusiService<Info>
{
public List<Info> GetHotInfoes(int columnID = 0, int maxRows = 10)
{
var infoes = base.GetQueryable(i => i.StateID == 1);
infoes = columnID > 0 ? infoes.Where(i => i.ColumnID == columnID) : infoes;
//排行计算规则:N=X+A-B
//1) N:排行计算值
//2) X=阅读数
//3) A=创建时间.hh×60+创建时间.mm
//4) B=(当前日期-创建时间.dd)×1000
// 这个排序应该怎么写???
return infoes.Take(maxRows).ToList();
}
}
LINQEntity FrameworkC#算法
{
/// <summary>
/// ID
/// </summary>
public int ID { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreateTime { get; set; }
/// <summary>
/// 阅读次数
/// </summary>
public int ViewTimes { get; set; }
/// <summary>
/// 分类ID
/// </summary>
public int ColumnID { get; set; }
/// <summary>
/// 状态
/// </summary>
public int StateID { get; set; }
}
public class InfoBusiService : AbstractBusiService<Info>
{
public List<Info> GetHotInfoes(int columnID = 0, int maxRows = 10)
{
var infoes = base.GetQueryable(i => i.StateID == 1);
infoes = columnID > 0 ? infoes.Where(i => i.ColumnID == columnID) : infoes;
//排行计算规则:N=X+A-B
//1) N:排行计算值
//2) X=阅读数
//3) A=创建时间.hh×60+创建时间.mm
//4) B=(当前日期-创建时间.dd)×1000
// 这个排序应该怎么写???
return infoes.Take(maxRows).ToList();
}
}
LINQEntity FrameworkC#算法
infoes = infoes.OrderByDescending(t => t.ViewTimes + CreateTime.Hour * 60 + CreateTime.Minute - (DateTime.Now - CreateTime).Days * 1000);
但是又报了另外一个错:
DbArithmeticExpression 参数必须具有数值通用类型。
这样中不
//得到次数
var a = infoes.Select(p => p.ViewTimes + p.CreateTime.Hour * 60 + p.CreateTime.Minute - ((DateTime.Now.Date - p.CreateTime.Date).TotalDays * 1000));
//得到排序后的infoes
var o = infoes.OrderByDescending(p => p.ViewTimes + p.CreateTime.Hour * 60 + p.CreateTime.Minute - ((DateTime.Now.Date - p.CreateTime.Date).TotalDays * 1000));
infoes = infoes.OrderByDescending(t => t.ViewTimes + t.CreateTime.Hour * 60 + CreateTime.Minute + System.Data.Objects.EntityFunctions.DiffDays(DateTime.Now , t.CreateTime).Value * 1000);
这里应该是加号,因为DiffDays(date1,date2)是date2-date1……我说怎么我看到的结果和我直接写sql查询的结果不一致……
这样不行,问题应该就是出在EF的解析上:根本解析不了(DateTime.Now - CreateTime).Days,所以会一直报“DbArithmeticExpression 参数必须具有数值通用类型。”
兄弟你这个一样,TotalDays 最开始我就试了,也是不能解析,跟上面的一个错。
多谢各位支持!问题圆满解决!
给分,结贴!