按linq和EF按月排序
我有一个linq查询,里面是月份名称。 我希望按月(1月,2月,3月,…)排序结果。
目前我有以下但它给了我和错误:
LINQ to Entities无法识别方法’System.DateTime Parse(System.String)’方法,并且此方法无法转换为存储表达式。
var shockValues = (from s in ctx.Shocks where s.ID == id orderby DateTime.Parse(s.MonthName) select new { val = s.MonthName + "=" + s.ShockValue });
你没什么选择。 您可以使用一长串可选运算符将名称映射到数字
order by s.MonthName == "Jan" ? 1 : s.MonthName == "Feb" ? 2 : ...
您可以在数据库中创建一个表,将表映射到nummeric值
var shockValues = (from s in ctx.Shocks join o in MonthOrder on s.MonthName equals o.MonthName where s.ID == id orderby o.MonthNumber select new { val = s.MonthName + "=" + s.ShockValue });
或者在内存中进行排序
var shockValues = (from s in ctx.Shocks where s.ID == id select new { s.MonthName, s.ShockValue }) .AsEnumerable() .OrderBy(s => DateTime.ParseExact(s.MonthName, "MMM", CultureInfo.InvariantCulture).Month) .Select(s => new { val = s.MonthName + "=" + s.ShockValue });
这样的事情应该有效
var shockValues = ctx.Shocks.Where(s => s.ID == id).Select(x => new {x.MonthName, MonthNum = x.MonthName == "Jan" : 1 ? x.MonthName == "Feb" : 2 ? 0}).OrderBy(s => MonthNum).Select(s => new {val = s.MonthName + "=" + s.ShockValue}
尝试:
orderby Convert.ToDateTime(s.MonthName + " 1, " + DateTime.Now.Year.ToString()).Month
如果您不想在数据库中创建表,则可以这样做
var names = DateTimeFormatInfo.CurrentInfo.MonthNames .Take(12).Select(s => new[] {s.Substring(0,3)});
然后针对单独的列表进行排序。
orderby names.IndexOf(s.MonthName)
最好的方法和最简单的方法是创建一个存储过程
Create procedure sortevents as SELECT * FROM [SAGMJ].[dbo].[Events] ORDER BY CASE WHEN MONTH([StartAt]) = MONTH(GETDATE()) AND YEAR([StartAt]) = YEAR(GETDATE()) THEN 0 ELSE 1 END, [StartAt];
//接下来打电话给你的sp
var v = (dc.sortevents()).ToList();