通过单独的`List `变量来排序列

我需要通过另一个列表中的元素索引对entity framework查询的结果进行排序。

我尝试了其他地方发现的建议,比如

.ThenBy(m=>list.IndexOf(m.Term)) 

但我收到HTTP 500错误,所以我想知道我是否遗漏了一些东西。 调试时,我得到了这个内部exception。

LINQ to Entities无法识别方法’Int32 IndexOf(System.String)’方法,并且此方法无法转换为存储表达式。

特别是,我正在考虑这种情况。

 private IEnumerable PopulateQuery(string selectedCampus) { var list = new List {"No Longer Alphabetical","Fall","Mid","Spring"}; return _db.MiaLog1A.Where(m => m.Campus == selectedCampus) .OrderBy(m => m.StudentName) .ThenBy(m=>m.Term) /* I would like to sort "Term" by the * order of "list". */ .AsEnumerable(); } 

有没有办法以这种方式排序,还是我只能通过字典排序或创建连接?

这应该是诀窍:

 private IEnumerable PopulateQuery(string selectedCampus) { var list = new List {"Fall","Mid","Spring"}; return _db.MiaLog1A.Where(m => m.Campus == selectedCampus) .AsEnumerable() .OrderBy(m => m.StudentName) .ThenBy(m=> list.IndexOf(m.Term)); } 

这是一种疯狂的方式,但它不会回归IEnumerable

 var db = new BloggingContext(); var list = (new List { "FR", "EN" }). Select((s,i)=> $"select '{s}' as {nameof(OrderIndex.Name)},{i} as {nameof(OrderIndex.Id)}"); var order = db.Set().FromSql(String.Join(" union ",list)); var orderedItems = from post in db.Posts join ln in order on post.Lang equals ln.Name into lnPost from od in lnPost.DefaultIfEmpty() orderby od.Id select post; var data = orderedItems.ToList(); 

你可以在这里找到BloggingContext的定义我刚为语言代码添加了一个Lang字段。 这将在SQLite,SqlServer和MySQL中用于oracle,你需要from dual添加由于EF核心有多糟糕,你需要像对待SQL视图那样对OrderIndex执行相同的过程。 在EF 6中,使用SqlQuery有一个更好的方法,你不需要像EF核心那样进行注册。 创建的查询是

 SELECT "post"."PostId", "post"."BlogId", "post"."Content", "post"."Date", "post"."Lang", "post"."Title", "ln"."Id", "ln"."Name" FROM "Posts" AS "post" LEFT JOIN ( select 'FR' as Name,0 as Id union select 'EN' as Name,1 as Id ) AS "ln" ON "post"."Lang" = "ln"."Name" ORDER BY "ln"."Id", "post"."Lang" 

编辑:只记得一种不同的方式,它不是那么疯狂,但可能会更好。

 var lang = new List { "FR", "EN" }; var orderedItems = from post in db.Posts orderby (lang[0] == post.Lang) ? 0 :((lang[1] == post.Lang) ? 1 : 2) select post; var param = Expression.Parameter(typeof(Post)); var order = lang.Select((s, i) => new { s, i }) .Aggregate((Expression)Expression.Constant(lang.Count), (agg, i) => Expression.Condition( Expression.Equal(Expression.Property(param,nameof(Post.Lang)), Expression.Constant(is)), Expression.Constant(ii), agg)); var exp = Expression.Lambda>(order, param); var data = db.Posts.OrderBy(exp).ToList(); 

和SQL

 SELECT "p"."PostId", "p"."BlogId", "p"."Content", "p"."Date", "p"."Lang", "p"."Title" FROM "Posts" AS "p" ORDER BY CASE WHEN "p"."Lang" = 'EN' THEN 1 ELSE CASE WHEN "p"."Lang" = 'FR' THEN 0 ELSE 2 END END 

我仍然认为疯狂的方式对于我不知道的事情是有用的。