按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();