项目架构是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#算法

解决方案 »

  1.   

    var q=infoes.OrderByDescending(t=>t.ViewTimes+CreateTime.Hour*60+CreateTime.Minute-(DateTime.Now.DayOfYear-CreateTime.DayOfYear)*1000);
      

  2.   

    LINQ to Entities 不支持指定的类型成员“DayOfYear”。只支持初始值设定项、实体成员和实体导航属性。我修改了下,如下:
      

  3.   

    LINQ to Entities 不支持指定的类型成员“DayOfYear”。只支持初始值设定项、实体成员和实体导航属性。我修改了下,如下:
    infoes = infoes.OrderByDescending(t => t.ViewTimes + CreateTime.Hour * 60 + CreateTime.Minute - (DateTime.Now - CreateTime).Days * 1000);
    但是又报了另外一个错:
    DbArithmeticExpression 参数必须具有数值通用类型。
      

  4.   

    infoes = infoes.OrderByDescending(t => t.ViewTimes + CreateTime.Hour * 60 + CreateTime.Minute - (int)((DateTime.Now - CreateTime).Days) * 1000);
    这样中不
      

  5.   

    infoes = infoes.OrderByDescending(t => t.ViewTimes + t.CreateTime.Hour * 60 + CreateTime.Minute - System.Data.Objects.EntityFunctions.DiffDays(DateTime.Now - t.CreateTime) * 1000);
      

  6.   

    infoes = infoes.OrderByDescending(t => t.ViewTimes + t.CreateTime.Hour * 60 + CreateTime.Minute - System.Data.Objects.EntityFunctions.DiffDays(DateTime.Now - t.CreateTime).Value * 1000);
      

  7.   

    囧~~~infoes = infoes.OrderByDescending(t => t.ViewTimes + t.CreateTime.Hour * 60 + CreateTime.Minute - System.Data.Objects.EntityFunctions.DiffDays(DateTime.Now , t.CreateTime).Value * 1000);
      

  8.   


    //得到次数
     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));
      

  9.   

    这是正解,不过,
    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 最开始我就试了,也是不能解析,跟上面的一个错。
    多谢各位支持!问题圆满解决!
    给分,结贴!