none
Select Min Values in each group using Linq RRS feed

  • Question

  • I have a table like this:
     Num DateValue
     1 1/2/2010
     1 2/4/2009
     1 5/13/2008
     1 1/13/2011
     2 2/23/2007
     2 7/8/2002
     2 12/17/2005
     3 6/9/2003
     3 7/1/2010
     4 5/10/2008
     4 7/26/2009
     4 1/18/2011
     
    I want to get the min date for each Num group
     
    Num DateValue
     1 5/13/2008
     2 7/8/2002
     3 6/9/2003
     4 5/10/2008
     
    How would I do this in LINQ?

    the answer is:
    om t in table
     
    group t.DateValue by t.Num into g
     
    select new
     
    {
     
    g.Key,
     
    Min = g.Min( x=>x)
     
    }

    but let say I have extra columns like this:

     Num  DateValue field1  field2
     1  1/2/2010 1  1
     1  2/4/2009 2  2
     1  5/13/2008 3  3
     1  1/13/2011 4  3
     2  2/23/2007 5  5
     2  7/8/2002 6  6
     2  12/17/2005 7  7
     3  6/9/2003 8  8
     3  7/1/2010 9  9
     4  5/10/2008 10  10
     4  7/26/2009 11  11
     4  1/18/2011 12  12
     
    how would I write linq to print out the two fields field1 and fielf2
    Num  DateValue field1 field2
     1  5/13/2008 3 3
     2  7/8/2002 6 6
     3  6/9/2003 8 8
     4  5/10/2008 10 10
    thanks

    Monday, October 22, 2012 3:27 AM

Answers

  • TqTran : Hope the below helps .. please try

                   public static void Main(string[] args)
            {
                DataTable objTable = new DataTable();
                objTable.Columns.Add("Key", typeof(int));
                objTable.Columns.Add("DateValue", typeof(DateTime));
                objTable.Columns.Add("field1", typeof(int));
                objTable.Columns.Add("field2", typeof(int));
                DataRow objRow;
                objRow = objTable.NewRow(); objRow[0] = 1; objRow[1] = new DateTime(2010, 1, 2); objRow[2] = 1; objRow[3] = 1; objTable.Rows.Add(objRow);
                objRow = objTable.NewRow(); objRow[0] = 1; objRow[1] = new DateTime(2009, 2, 4); objRow[2] = 2; objRow[3] = 2; objTable.Rows.Add(objRow);
                objRow = objTable.NewRow(); objRow[0] = 1; objRow[1] = new DateTime(2008, 5, 13); objRow[2] = 3; objRow[3] = 3; objTable.Rows.Add(objRow);
                objRow = objTable.NewRow(); objRow[0] = 1; objRow[1] = new DateTime(2011, 1, 13); objRow[2] = 4; objRow[3] = 4; objTable.Rows.Add(objRow);
                objRow = objTable.NewRow(); objRow[0] = 2; objRow[1] = new DateTime(2007, 2, 23); objRow[2] = 5; objRow[3] = 5; objTable.Rows.Add(objRow);
                objRow = objTable.NewRow(); objRow[0] = 2; objRow[1] = new DateTime(2002, 8, 7); objRow[2] = 6; objRow[3] = 6; objTable.Rows.Add(objRow);
                objRow = objTable.NewRow(); objRow[0] = 2; objRow[1] = new DateTime(2005, 12, 17); objRow[2] = 7; objRow[3] = 7; objTable.Rows.Add(objRow);
                objRow = objTable.NewRow(); objRow[0] = 3; objRow[1] = new DateTime(2003, 9, 6); objRow[2] = 8; objRow[3] = 8; objTable.Rows.Add(objRow);
                objRow = objTable.NewRow(); objRow[0] = 3; objRow[1] = new DateTime(2010, 1, 7); objRow[2] = 9; objRow[3] = 9; objTable.Rows.Add(objRow);
                objRow = objTable.NewRow(); objRow[0] = 4; objRow[1] = new DateTime(2008, 5, 10); objRow[2] = 10; objRow[3] = 10; objTable.Rows.Add(objRow);
                objRow = objTable.NewRow(); objRow[0] = 4; objRow[1] = new DateTime(2009, 7, 26); objRow[2] = 11; objRow[3] = 11; objTable.Rows.Add(objRow);
                objRow = objTable.NewRow(); objRow[0] = 4; objRow[1] = new DateTime(2011, 1, 18); objRow[2] = 12; objRow[3] = 12; objTable.Rows.Add(objRow);
                objTable.AcceptChanges();
                int max = 4;
                for (int i = 1; i <= max; i++)
                {
                    DataRow[] objRows = objTable.Select("Key =" + i, "DateValue asc");

                    if (objRows.Length > 0)
                    {
                        DataRow sortedRow = objRows[0];
                        System.Console.WriteLine("{0} {1} {2} {3}", sortedRow[0], sortedRow[1], sortedRow[2], sortedRow[3]);
                    }

                }
                System.Console.WriteLine("linq");
                  

                var query = from row in objTable.AsEnumerable()
                             group row by row["Key"] into grp
                          select grp.OrderBy(a => a["DateValue"]).First();

                 

                foreach (var x in query)
                {
                    System.Console.WriteLine("{0} {1} {2} {3}", x["Key"],x["DateValue"],x["field1"],x["field2"]);                
                }

            }

      


    • Edited by Venkat786 Monday, October 22, 2012 1:15 PM
    • Marked as answer by Alexander Sun Monday, November 5, 2012 9:33 AM
    Monday, October 22, 2012 1:07 PM

All replies

    1. You can append some aggregate function to field1 and field2(Min, Max or ...)
    2. Your can get them as a collections of the group

    Please mark as reply if helped.
    Also visit my blog http://msguy.net/

    Monday, October 22, 2012 1:05 PM
  • TqTran : Hope the below helps .. please try

                   public static void Main(string[] args)
            {
                DataTable objTable = new DataTable();
                objTable.Columns.Add("Key", typeof(int));
                objTable.Columns.Add("DateValue", typeof(DateTime));
                objTable.Columns.Add("field1", typeof(int));
                objTable.Columns.Add("field2", typeof(int));
                DataRow objRow;
                objRow = objTable.NewRow(); objRow[0] = 1; objRow[1] = new DateTime(2010, 1, 2); objRow[2] = 1; objRow[3] = 1; objTable.Rows.Add(objRow);
                objRow = objTable.NewRow(); objRow[0] = 1; objRow[1] = new DateTime(2009, 2, 4); objRow[2] = 2; objRow[3] = 2; objTable.Rows.Add(objRow);
                objRow = objTable.NewRow(); objRow[0] = 1; objRow[1] = new DateTime(2008, 5, 13); objRow[2] = 3; objRow[3] = 3; objTable.Rows.Add(objRow);
                objRow = objTable.NewRow(); objRow[0] = 1; objRow[1] = new DateTime(2011, 1, 13); objRow[2] = 4; objRow[3] = 4; objTable.Rows.Add(objRow);
                objRow = objTable.NewRow(); objRow[0] = 2; objRow[1] = new DateTime(2007, 2, 23); objRow[2] = 5; objRow[3] = 5; objTable.Rows.Add(objRow);
                objRow = objTable.NewRow(); objRow[0] = 2; objRow[1] = new DateTime(2002, 8, 7); objRow[2] = 6; objRow[3] = 6; objTable.Rows.Add(objRow);
                objRow = objTable.NewRow(); objRow[0] = 2; objRow[1] = new DateTime(2005, 12, 17); objRow[2] = 7; objRow[3] = 7; objTable.Rows.Add(objRow);
                objRow = objTable.NewRow(); objRow[0] = 3; objRow[1] = new DateTime(2003, 9, 6); objRow[2] = 8; objRow[3] = 8; objTable.Rows.Add(objRow);
                objRow = objTable.NewRow(); objRow[0] = 3; objRow[1] = new DateTime(2010, 1, 7); objRow[2] = 9; objRow[3] = 9; objTable.Rows.Add(objRow);
                objRow = objTable.NewRow(); objRow[0] = 4; objRow[1] = new DateTime(2008, 5, 10); objRow[2] = 10; objRow[3] = 10; objTable.Rows.Add(objRow);
                objRow = objTable.NewRow(); objRow[0] = 4; objRow[1] = new DateTime(2009, 7, 26); objRow[2] = 11; objRow[3] = 11; objTable.Rows.Add(objRow);
                objRow = objTable.NewRow(); objRow[0] = 4; objRow[1] = new DateTime(2011, 1, 18); objRow[2] = 12; objRow[3] = 12; objTable.Rows.Add(objRow);
                objTable.AcceptChanges();
                int max = 4;
                for (int i = 1; i <= max; i++)
                {
                    DataRow[] objRows = objTable.Select("Key =" + i, "DateValue asc");

                    if (objRows.Length > 0)
                    {
                        DataRow sortedRow = objRows[0];
                        System.Console.WriteLine("{0} {1} {2} {3}", sortedRow[0], sortedRow[1], sortedRow[2], sortedRow[3]);
                    }

                }
                System.Console.WriteLine("linq");
                  

                var query = from row in objTable.AsEnumerable()
                             group row by row["Key"] into grp
                          select grp.OrderBy(a => a["DateValue"]).First();

                 

                foreach (var x in query)
                {
                    System.Console.WriteLine("{0} {1} {2} {3}", x["Key"],x["DateValue"],x["field1"],x["field2"]);                
                }

            }

      


    • Edited by Venkat786 Monday, October 22, 2012 1:15 PM
    • Marked as answer by Alexander Sun Monday, November 5, 2012 9:33 AM
    Monday, October 22, 2012 1:07 PM