Linq - OrderBy int列给出不正确的结果

Anu*_*nup 3 c# linq

我有以下查询,它给我不正确的结果.我想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.

我在这做错了什么?

Maa*_*ten 6

根据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)