我有以下查询,它给我不正确的结果.我想Order By first Year&然后By Month.所以我的结果应该是Jan 2015, Feb 2015, Mar 2015等等.
var data = ctx.tblCalendar
.Where(e => e.Id == Id)
.OrderBy(e => e.Year).ThenBy(e => e.MonthNo)
.Select(e => (InputMonths)e.Month + "-" + e.Year)
.Distinct()
.ToList();
DataType of MonthNo is int
DataType of Year is int
DataType of Month is Enum
Run Code Online (Sandbox Code Playgroud)
以上查询给出了结果April 2015, August 2015, December 2015,Feb 2015等等.它是由字母排序的Enum.
我在这做错了什么?
根据IEnumerable<T>.Dictinct()扩展方法的文档,返回的序列是无序的.
Distinct(IEnumerable)方法返回一个不包含重复值的无序序列.它使用默认的相等比较器Default来比较值.
并且IQuerable<T>.Distinct()扩展方法的文档说明了同样的事情,这是合乎逻辑的,因为它将被转换为任何提供者(SQL,EF)正在工作.
由于执行表示调用Distinct(IQueryable)的表达式树而发生的查询行为取决于source参数类型的实现.预期的行为是它返回源中唯一项的无序序列.
解决方案是选择您需要的数据,执行您的数据,然后订购结果,最后进行预测.
像这样:
var data = ctx.tblCalendar
.Where(e => e.Id == Id)
.Select(e => new { e.Year, e.MonthNo, e.Month })
.Distinct()
.OrderBy(e => e.Year)
.ThenBy(e => e.MonthNo)
.Select(e => (InputMonths)e.Month + "-" + e.Year)
.ToList();
Run Code Online (Sandbox Code Playgroud)