新手请教一个Linq先分组再排序的问题

会思考的草 2014-12-08 04:47:50
我有一个集合IList<RawWeeklyAccounts>:
public class RawWeeklyAccounts
{
public long TotalAccounts { get; set; }
public int weeknumber { get; set; }
public string MsuName { get; set; }
}

我想先按照MsuName分组,对每个分组按照WeekNumber排序,最后返回一个新的Entity:
WeeklyAccounts
{
public int Weeknumber;
public long TotalAccounts; //即原表的WeeklyAccounts。
}

请问LINQ应该怎么写呢?
...全文
1147 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
它的函数式连缀写法是这样的:
var result = datasource
            .GroupBy(x => x.MsuName)
            .Select(g => new
            {
                MsuName = g.Key,
                Accounts = g.OrderBy(y => y.weeknumber)
            });
  • 打赏
  • 举报
回复
引用 3 楼 codewarrior 的回复:
另外如果不使用LINQ语法,使用集合的函数语法(OrderBy(),Where()),应该怎么写呢?这两种写法有什么不同和优缺点呢?谢谢
函数写法跟类SQL的写法,都是Linq机制。不是说只有SQL写法才是Linq。 函数写法主要可以用在非常简单的计算表达上。对于稍微复杂一点的Linq计算公式,它显得不够清晰,不易于书写和维护。
  • 打赏
  • 举报
回复
引用 3 楼 codewarrior 的回复:
谢谢,我的想法是这样: 先在原始表中过滤掉一些非法元素:TotalAccounts > 0, weekNumber >0, MsuName不为空; 然后按照MsuName分组; 分组后的各组按照weeknumber升序排列; 最后返回一个WeeklyAccounts的集合(我想倒数最后这两步应该是可以颠倒次序的)。
var result = from x in datasource
                group x by x.MsuName into g
                select new
                {
                    MsuName = g.Key,
                    Accounts = from y in g
                            orderby y.weeknumber
                            select y
                };
rr_1724826853 2015-04-03
  • 打赏
  • 举报
回复
对数据进行多条件排序 private DataTable GetStudent() { string P_Str_ConnectionStr = string.Format(//创建数据库连接字符串 @"server=WIN-GI7E47AND9R\LS;database=db_TomeTwo;uid=sa;pwd="); string P_Str_SqlStr = string.Format(//创建SQL查询字符串 "SELECT * FROM tb_Grade ORDER BY 马经 ASC,高数 DESC"); SqlDataAdapter P_SqlDataAdapter = new SqlDataAdapter(//创建数据适配器 P_Str_SqlStr, P_Str_ConnectionStr);//codego.net/ DataTable P_dt = new DataTable();//创建数据表 P_SqlDataAdapter.Fill(P_dt);//填充数据表 return P_dt;//返回数据表 }
BestSmiles 2014-12-11
  • 打赏
  • 举报
回复


            List<RawWeeklyAccounts> query = new List<RawWeeklyAccounts>() 
            {
                new RawWeeklyAccounts(31,5,"A"),
                new RawWeeklyAccounts(32,6,"B"),
                new RawWeeklyAccounts(33,-5,"A"),
                new RawWeeklyAccounts(34,1,"B"),
                new RawWeeklyAccounts(35,5,"B"),
            };
  var r = query.Where(condition => condition.TotalAccounts > 0 && condition.weeknumber > 0 &&  !string.IsNullOrEmpty(condition.MsuName)).
                OrderByDescending(order => order.weeknumber).GroupBy(groupName => groupName.MsuName).ToList();

游离失所 2014-12-08
  • 打赏
  • 举报
回复


  class Program
    {
        static void Main(string[] args)
        {
            
            List<RawWeeklyAccounts> list = new List<RawWeeklyAccounts>();
            List<WeeklyAccounts> result = list.GroupBy(x => x.MsuName).Select(x =>
            {
                var temp = x.OrderBy(y => y.weeknumber).FirstOrDefault();
                if (temp == null)
                    return null;
                return new WeeklyAccounts()
                {
                    Weeknumber = temp.weeknumber,
                    TotalAccounts = temp.TotalAccounts
                };
            }).ToList();
        }
    }

    public class RawWeeklyAccounts
    {
        public long TotalAccounts { get; set; }
        public int weeknumber { get; set; }
        public string MsuName { get; set; }
    }

    public class WeeklyAccounts
    {
        public int Weeknumber;
        public long TotalAccounts; //即原表的WeeklyAccounts。
    }

  • 打赏
  • 举报
回复
var query = from p in tbs
                    order by p.weeknumber 
                   group p  by p.weeknumber into g
                   select g;
先排再分组不是一样的效果么...
会思考的草 2014-12-08
  • 打赏
  • 举报
回复
引用 2 楼 q107770540 的回复:
List<RawWeeklyAccounts> list;

 var q=from r in list.GroupBy(x=>x.MsuName)
       order r by r.weeknumber 
       select new WeeklyAccounts
       {
          Weeknumber=r.weeknumber,
          TotalAccounts=r.TotalAccounts 
       };
谢谢,我的想法是这样: 先在原始表中过滤掉一些非法元素:TotalAccounts > 0, weekNumber >0, MsuName不为空; 然后按照MsuName分组; 分组后的各组按照weeknumber升序排列; 最后返回一个WeeklyAccounts的集合(我想倒数最后这两步应该是可以颠倒次序的)。 另外如果不使用LINQ语法,使用集合的函数语法(OrderBy(),Where()),应该怎么写呢?这两种写法有什么不同和优缺点呢?谢谢
q107770540 2014-12-08
  • 打赏
  • 举报
回复
List<RawWeeklyAccounts> list;

 var q=from r in list.GroupBy(x=>x.MsuName)
       order r by r.weeknumber 
       select new WeeklyAccounts
       {
          Weeknumber=r.weeknumber,
          TotalAccounts=r.TotalAccounts 
       };
q107770540 2014-12-08
  • 打赏
  • 举报
回复
引用 楼主 codewarrior 的回复:
我想先按照MsuName分组,对每个分组按照WeekNumber排序,
首先,按照MsuName分组后,每组内有多个WeekNumber, 你想怎么排序?

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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