LINQ GroupBy getting a specific element
-
lunes, 16 de abril de 2012 14:28
I have the following Object Structure
List<Order> orders = new List<Order> { new Order(){OrderId=1,UserId=1,OrderQuantity=10, OrderDescription="Desc", OrderDate=new DateTime(2012, 4, 16)}, new Order(){OrderId=2,UserId=1,OrderQuantity=10, OrderDescription="Desc", OrderDate=new DateTime(2012, 4, 17)}, new Order(){OrderId=3,UserId=1,OrderQuantity=10, OrderDescription="Desc", OrderDate=new DateTime(2012, 4, 18)}, new Order(){OrderId=4,UserId=4,OrderQuantity=10, OrderDescription="Desc", OrderDate=new DateTime(2012, 4, 16)} };
I want to group by UserId and get only to the latest order for each user. For example if I take UserId=1 then I want to get only OrderId=3 since that is the latest. How can I do this using LINQ?
Todas las respuestas
-
lunes, 16 de abril de 2012 14:46
This might help you.
class Program { static void Main(string[] args) { List<Order> orders = new List<Order>() { new Order(){OrderId=1,UserId=1,OrderQuantity=10, OrderDescription="Desc", OrderDate=new DateTime(2012, 4, 16)}, new Order(){OrderId=2,UserId=1,OrderQuantity=10, OrderDescription="Desc", OrderDate=new DateTime(2012, 4, 17)}, new Order(){OrderId=3,UserId=1,OrderQuantity=10, OrderDescription="Desc", OrderDate=new DateTime(2012, 4, 18)}, new Order(){OrderId=4,UserId=4,OrderQuantity=10, OrderDescription="Desc", OrderDate=new DateTime(2012, 4, 16)} }; var result= orders.Where(r => r.UserId == 1).Max(s => s.OrderId); Console.WriteLine(result); } } public class Order { public int OrderId { get; set; } public int UserId { get; set; } public int OrderQuantity { get; set; } public string OrderDescription { get; set; } public DateTime OrderDate { get; set; } }
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
- Marcado como respuesta Bob ShenMicrosoft Contingent Staff, Moderator martes, 01 de mayo de 2012 3:40
-
lunes, 16 de abril de 2012 15:25
orders.GroupBy(order => order.UserId) .Select(group => new { UserId = group.Key, LatestOrder = group.Max(order => order.OrderId), });
- Editado servy42Microsoft Community Contributor lunes, 16 de abril de 2012 15:25
- Marcado como respuesta Bob ShenMicrosoft Contingent Staff, Moderator martes, 01 de mayo de 2012 3:40
-
lunes, 16 de abril de 2012 15:34
I'd use this:
var results = from Order o in orders group o by o.UserId into g select g.OrderByDescending(og => og.OrderDate).First();
- Marcado como respuesta Bob ShenMicrosoft Contingent Staff, Moderator martes, 01 de mayo de 2012 3:40
-
lunes, 16 de abril de 2012 16:57
Check following links, it may help you.
- Marcado como respuesta Bob ShenMicrosoft Contingent Staff, Moderator martes, 01 de mayo de 2012 3:40
-
lunes, 16 de abril de 2012 17:56
Based on Madirai`s class, you can do:
int _userID = 1;//your variable int _oderID = orders.Where(w => w.UserId == _userID).OrderByDescending(o => o.OrderDate).Select(s => s.OrderId).First();
Mitja
- Marcado como respuesta Bob ShenMicrosoft Contingent Staff, Moderator martes, 01 de mayo de 2012 3:40
-
martes, 17 de abril de 2012 7:08
I didn't check if it's more efficient but I find it more intuitive to select the order with the max OrderDate rather than selecting the first after ordering:var results = from Order o in orders group o by o.UserId into g let max = g.Max(og => og.OrderDate) select g.First(og => og.OrderDate == max);
- Marcado como respuesta Bob ShenMicrosoft Contingent Staff, Moderator martes, 01 de mayo de 2012 3:40

