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
纯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