如何让LINQ按Where子句条件顺序返回结果(无需OrderBy)
解决LINQ查询结果顺序问题的方案
这好办!你可以借助LINQ的Concat方法来拼接两个查询片段,既能保证先返回满足i.Id == questionId的记录,再接上符合第二个条件的结果,还能满足你「不使用OrderBy、单查询」的要求。
直接给你调整后的代码:
// 先筛选出ID匹配的主记录 var mainQuestions = db.Question.Where(i => i.Id == questionId); // 再筛选出关联ID匹配且符合IsAccept条件的记录 var relatedQuestions = db.Question.Where(i => i.RelatedId == questionId && i.IsAccept == isAccept); // 按顺序拼接两个结果集 return mainQuestions.Concat(relatedQuestions).ToList();
为什么这样可行?
- EF会把这个
Concat操作转化为包含UNION ALL的单条SQL语句,数据库会先执行第一个查询的逻辑,再执行第二个,最终结果的顺序完全符合你的预期。 - 由于
Id和RelatedId都是Guid类型,且你的两个过滤条件不会命中同一条记录(一条记录的Id不可能同时等于自身的RelatedId,除非业务上有特殊设计,但通常不会),所以不需要担心重复数据的问题。
原来的查询用||组合条件时,数据库会根据自身的执行计划返回结果,顺序是不可控的;而Concat是明确按你指定的顺序拼接两个结果集,完美解决了顺序问题。
内容的提问来源于stack exchange,提问作者Volkan
相关产品推荐
相关产品推荐

