SQL 表达式中的按值条件排序不会影响使用 SQLite.Net-PCL 的 LINQ 结果

Conditional Ordering By Value in SQL expression wont effect the LINQ Results using SQLite.Net-PCL

纯sql(在sqlite)是这样的:

select * from Employees order by case WorkDay
         WHEN 'MON' then 0
         WHEN 'TUE' then 1
         WHEN 'WED' then 2
         WHEN 'THU' then 3 
         WHEN 'FRI' then 4 END

sql 编辑器的结果没问题,符合预期

id| FullName   | Department| WorkDay
7   Frank Bone   C Block     MON
8   Frank Bone   D Block     TUE
6   Frank Bone   A Block     FRI
9   Frank Bone   E Block     FRI

和 C# 代码使用 SQLite.Net-PCL(通用 Windows 平台)

 var rows = 
     conn.Query<Employees>("select * from Employees order by case WorkDay
                            WHEN 'MON' then 0 
                            WHEN 'TUE' then 1
                            WHEN 'WED' then 2 
                            WHEN 'THU' then 3 
                            WHEN 'FRI' then 4 END").ToList();

      //rows.ForEach(x => { listBox1.Add(x); }); rows appears in wrong/weird order in debug mode. this line not important and not the cause of wrong order.

行按 weird/wrong 顺序出现

我得到的这些行的顺序有误。你知道是什么导致了这个奇怪的顺序吗?

id| FullName   | Department| WorkDay
6   Frank Bone   A Block     FRI
7   Frank Bone   C Block     MON
9   Frank Bone   E Block     FRI
8   Frank Bone   D Block     TUE

补充说明:table class (EF?)

型号
public class Employees
{

    [PrimaryKey, AutoIncrement]
    public int id { get; set; }

    public string FullName { get; set; }

    [Indexed]
    public string Department { get; set; }

    public string WorkDay { get; set; }
}

试试这个

定义 enum ,然后按照下面给出的方式进行休息

 [Flags] enum DayEnum { MON=0, TUE= 1, WED= 2, THU= 3, FRI = 4};

public class Employees
{
    [PrimaryKey, AutoIncrement]
    public int id { get; set; }
    public string FullName { get; set; }
    [Indexed]
    public string Department { get; set; }
    public string WorkDay { get; set    ; }
        public DayEnum DayNO{ get; set; }
    }

var employees = conn.Query<Employees>("select * from Employees");
var rows = (from e in employees
           select new Employee() {
                id  =e.id
                FullName   = e.FullName
                Department = e.Department
                WorkDay = e.WorkDay
                DayNO = (DayEnum ) Enum.Parse(typeof(DayEnum ), e.WorkDay)
            }).OrderBy(e=>e.DayNO );

根据您的评论,库似乎有问题,解决方法是

添加新的 属性 WorkDayNo

public class Employees
{
    [PrimaryKey, AutoIncrement]
    public int id { get; set; }
    public string FullName { get; set; }
    [Indexed]
    public string Department { get; set; }
    public string WorkDay { get; set; }
    public string WorkDayNo { get; set; }
}

像这样查询

var rows = 
     conn.Query<Employees>("select *, (case WorkDay
                                WHEN 'MON' then 0 
                                WHEN 'TUE' then 1
                                WHEN 'WED' then 2 
                                WHEN 'THU' then 3 
                                WHEN 'FRI' then 4 END) as WorkDayNo from Employees").OrderBy(e=> e.WorkDayNo).ToList();

你能试试下面的查询吗

select id, FullName, Department,WorkDay from
(select *, (case WorkDay
                            WHEN 'MON' then 0 
                            WHEN 'TUE' then 1
                            WHEN 'WED' then 2 
                            WHEN 'THU' then 3 
                            WHEN 'FRI' then 4 END) as workdayno from Employees) d  order by  workdayno