Linq 排序问题

风淡云清2013 2017-07-25 05:00:23
表里有一个字段OpenDate为日期型,我只取该字段的年月,以及部门字段UID 来分组,取年月后就变成了字符型
代码如下:

private GHEntities db = new GHEntities();
..............................略
IQueryable<ListForOpenTransactionVM> localDB = null;

localDB = (from o in db.tz_OpenTransactions

group o by new { o.UID, OpenDateYM = o.OpenDate.Year + "-" + o.OpenDate.Month} into g
orderby g.Key.OpenDateYM,g.Key.UID descending
select new ListForOpenTransactionVM
{
UID = g.Key.UID,
OpenDateYM = g.Key.OpenDateYM,
CountOT = g.Count(),
Account = db.Accounts.FirstOrDefault(a => a.ID == g.Key.UID)
}).Take(12);


分组排序后显示的结果如下
部门 年月 记录总数
财务部 2017-12 1
人事部 2017-4 1
财务部 2017-5 1
财务部 2017-6 2
人事部 2017-7 3
财务部 2017-7 1

我想要以年月为主降序排,该如何修改!
...全文
293 12 打赏 收藏 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
q107770540 2017-07-27
  • 打赏
  • 举报
回复
引用 3 楼 u012048297 的回复:
q107770540 + $exception {"LINQ to Entities 不识别方法“System.String[] Split(Char[])”,因此该方法无法转换为存储表达式。"} System.NotSupportedException
try this: localDB = (from o in db.tz_OpenTransactions.ToList() group o by new { o.UID, OpenDateYM = o.OpenDate.Year + "-" + o.OpenDate.Month} into g let date = g.Key.OpenDateYM.Split('-') orderby Convert.ToInt32(date[0]) descending, Convert.ToInt32(date[1]) descending select new ListForOpenTransactionVM { UID = g.Key.UID, OpenDateYM = g.Key.OpenDateYM, CountOT = g.Count(), Account = db.Accounts.FirstOrDefault(a => a.ID == g.Key.UID) }).Take(12);
ilikeff8 2017-07-26
  • 打赏
  • 举报
回复

            DataTable dt = new DataTable();
            dt.Columns.Add("Department");
            dt.Columns.Add("OpenDate");

            dt.Rows.Add(new object[] { "财务部", new DateTime(2017, 12, 1, 0, 0, 0) });
            dt.Rows.Add(new object[] { "财务部", new DateTime(2017, 5, 1, 0, 0, 1) });
            dt.Rows.Add(new object[] { "财务部", new DateTime(2017, 6, 1, 0, 0, 2) });
            dt.Rows.Add(new object[] { "财务部", new DateTime(2017, 6, 2, 0, 0, 3) });
            dt.Rows.Add(new object[] { "财务部", new DateTime(2017, 6, 3, 0, 0, 4) });
            dt.Rows.Add(new object[] { "财务部", new DateTime(2017, 7, 1, 0, 0, 5) });
            dt.Rows.Add(new object[] { "人事部", new DateTime(2017, 4, 1, 0, 0, 6) });
            dt.Rows.Add(new object[] { "人事部", new DateTime(2017, 7, 1, 0, 0, 7) });
            dt.Rows.Add(new object[] { "人事部", new DateTime(2017, 7, 2, 0, 0, 8) });
            dt.Rows.Add(new object[] { "人事部", new DateTime(2017, 7, 3, 0, 0, 9) });

            var q = from d in dt.AsEnumerable()
                    group d by new
                    {
                        Department = d[0].ToString(),
                        OpenDate = DateTime.Parse(d[1].ToString()).Date.AddDays(-DateTime.Parse(d[1].ToString()).Day + 1),
                    } into g
                    orderby g.Key.OpenDate descending,g.Key.Department 
                    select new
                    {
                        部门 = g.Key.Department,
                        年月 = g.Key.OpenDate.ToString("yyyy-M"),
                        记录总数 = g.Count()
                    };


            var result = q.ToList();
            MessageBox.Show(string.Join(Environment.NewLine, result.ToList()));
ilikeff8 2017-07-26
  • 打赏
  • 举报
回复
风淡云清2013 2017-07-26
  • 打赏
  • 举报
回复
to: liubin911 改成 orderby g.Key.OpenDateYM descending, g.Key.UID descending 显示如下 部门 年月 记录总数 人事部 2017-7 3 财务部 2017-7 1 财务部 2017-6 2 财务部 2017-5 1 人事部 2017-4 1 财务部 2017-12 1 12月又排到了后面
liubin911 2017-07-26
  • 打赏
  • 举报
回复
try orderby g.Key.OpenDateYM,g.Key.UID descending=》orderby g.Key.OpenDateYM descending,g.Key.UID descending
风淡云清2013 2017-07-26
  • 打赏
  • 举报
回复
q107770540 + $exception {"LINQ to Entities 不识别方法“System.String[] Split(Char[])”,因此该方法无法转换为存储表达式。"} System.NotSupportedException
ilikeff8 2017-07-26
  • 打赏
  • 举报
回复
如果是老版本ef,可以用SqlFuncrtions,或EdmFunctions,都大同小异的
ilikeff8 2017-07-26
  • 打赏
  • 举报
回复
引用 8 楼 u012048297 的回复:
linq to ef 不支持 addDays语法 共享一下 from o in db.tz_OpenTransactions group o by new { o.UID, Year = o.OpenDate.Year, Month = o.OpenDate.Month } into g orderby g.Key.Year descending, g.Key.Month descending select new ListForOpenTransactionVM { UID = g.Key.UID, OpenDateYM = g.Key.Year + "-" + g.Key.Month, CountOT = g.Count(), Account = db.Accounts.FirstOrDefault(a => a.ID == g.Key.UID) }
是演示代码,懒得去捡数据库表和EF实体, 忘了说了,如果是EF6,则AddDays可以替换为 using System.Data.Entity; DbFunctions.AddDays
正怒月神 2017-07-26
  • 打赏
  • 举报
回复
引用 8 楼 u012048297 的回复:
linq to ef 不支持 addDays语法
并不是linq to ef不支持adddays, 只是使用这个方法你需要对象已经是一个 IEnumerable<T> 加载到本地的对象。 不过你可以使用 SqlFunctions.DateAdd https://msdn.microsoft.com/en-us/library/dd466214(v=vs.110).aspx
风淡云清2013 2017-07-26
  • 打赏
  • 举报
回复
linq to ef 不支持 addDays语法 共享一下 from o in db.tz_OpenTransactions group o by new { o.UID, Year = o.OpenDate.Year, Month = o.OpenDate.Month } into g orderby g.Key.Year descending, g.Key.Month descending select new ListForOpenTransactionVM { UID = g.Key.UID, OpenDateYM = g.Key.Year + "-" + g.Key.Month, CountOT = g.Count(), Account = db.Accounts.FirstOrDefault(a => a.ID == g.Key.UID) }
q107770540 2017-07-26
  • 打赏
  • 举报
回复
localDB = (from o in db.tz_OpenTransactions
                           
                           group o by new { o.UID, OpenDateYM = o.OpenDate.Year + "-" + o.OpenDate.Month} into g
                           let date = g.Key.OpenDateYM.Split('-')
                           orderby  Convert.ToInt32(date[0]) descending, Convert.ToInt32(date[1]) descending
                           select new ListForOpenTransactionVM
                           {
                               UID = g.Key.UID,
                               OpenDateYM = g.Key.OpenDateYM,
                               CountOT = g.Count(),
                               Account = db.Accounts.FirstOrDefault(a => a.ID == g.Key.UID)
                           }).Take(12);
csdnFUCKINGSUCKS 2017-07-25
  • 打赏
  • 举报
回复

group o by new { o.UID, OpenDateYM = new DateTime(int.Parse(o.OpenDate.Year), int.Parse(o.OpenDate.Month), 0)} into g
附训练好的 YOLO 权重与 PyQt 可视化检测界面,页面底部含可视化效果预览,毕设/课设开箱即用。 【数据集概况】 · 检测类别(中文):[领航车(leader)] · 训练集:414 张 · 验证集:39 张 · 测试集:20 张 · 总计:473 张 该数据集聚焦于室内走廊环境中对领航车的精准识别与定位,具备高度场景专一性与实际应用价值。图像采集于光线均匀、结构规整的建筑内部通道,背景干扰因素少,有利于模型在复杂环境下的目标提取能力训练。领航车作为核心检测对象,在不同距离和角度下均被清晰标注,为智能导航系统、自动化引导设备等提供可靠的数据支持。... 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 77 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.9950** mAP50-95 | 0.9141 Precision | 0.9985 Recall | 1.0000 train/box_loss | 0.5224 train/cls_loss | 0.2526 val/box_loss | 0.4307 val/cls_loss | 0.1407 【训练过程分析】 77 轮训练后 mAP50 达到 0.9950,模型收敛良好。Loss 曲线前段快速下降,后段趋于平稳,val_loss 无反弹,没有明显过拟合。mAP50-95 为 0.9141,和 mAP50 差距仅 0.08,框的定位精度也很扎实。 【模型性能评估】 Precision 0.9985、Recall 1.000... 使用场景:毕业设计、课程设计、深度学习入门、工业场景落地验证。

111,128

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧