有这样一批数据:
List<MyClass> list = new List<MyClass>()
{
new MyClass() {id = 0, name = "待制定", value1 = 1, value2 = 1},
new MyClass() {id = 0, name = "待制定", value1 = 2, value2 = 2},
new MyClass() {id = 0, name = "待制定", value1 = 3, value2 = 3},
new MyClass() {id = 1, name = "已制定", value1 = 2, value2 = 1},
new MyClass() {id = 1, name = "已制定", value1 = 3, value2 = 2},
new MyClass() {id = 1, name = "已制定", value1 = 4, value2 =3}
};
在这个例子中,id就只有0跟1两种情况,首先要按照id进行排序,然后当id=0的时候,对value1排序,当id=1的时候对value2进行一个降序排序。
用linq能实现这个排序吗?
list.orderby(a=>a.id).thenbydesc(a=>a.id==0?a.value1:a.vlaue2)
单次懒得去查.知道是什么意思就行
value1是正常排序,value2是降序排序的
@PowerDK: 那就.thenbydesc(a=>a.id==0?a.value1*-1:a.vlaue2)
@PowerDK: 总的来说这个和linq没关系.是思路问题.
@吴瑞祥: 十分感谢您提供了这个思路!
但貌似在实际解决中,这value1跟value2都是日期格式的,数据库又是mysql,貌似也对日期做不了计算
@PowerDK: 是的.这种需求是肯定会全表扫描的.换种解决方案吧.比如分成几段.然后一段一段查.再拼接起来.
@吴瑞祥: 数据量不会太大,所以也不怎么考虑性能!这个linq也对日期转化不了,这样只能保持都是升序或者是降序,假如一升一降就处理不了了。看来只能找其他方法了
@PowerDK: 谁说的.被你说的都有点气了.
要是数据不大.你直接读到内存里处理.至于你说的日期转化不了.
那你就把日期转成整数不久好了.
.thenbydesc(a=>a.id==0?(a.value1 - DateTime.Now).TotalSeconds*-1:(a.vlaue2-DateTime.now).TotalSeconds)
@吴瑞祥: 这实际还是有点麻烦的!我用的数据库是mysql,上面的语句翻译成sql的时候,执行.TotalSeconds是会报错的~所以在计算这个日期的时候会报错~
因为测试是直接用list的,所以支持计算日期
@PowerDK: 要是数据不大.你直接读到内存里处理.你自己都说数据量不大了.
@吴瑞祥: 就假设不能读到内存,好像真写不出来了
@PowerDK: 那就加个字段.把所有日子用数据库函数转成整型.再以那个字段排序.
@吴瑞祥: 后面还是写sql,执行sql了,还是感谢你提供了思路