简体   繁体   中英

Use the Linq Count

I want to show OrderDetails Count near the orders information in the grid but in the select Unit i can only select the Key and Count. What is the way to select the orders information?

var Q = from Data in Context.Orders
        join D2 in Context.OrderDetails on Data.OrderID equals D2.OrderID
        group Data by Data.OrderID into grouped
                       select new
                              {
                                  grouped=g.Key,
                                  Count = grouped.Count() 
                              };

You can group it by whole order entity like

var Q = from Data in Context.Orders
        join D2 in Context.OrderDetails on Data.OrderID equals D2.OrderID
        group Data by Data into grouped
                       select new
                              {
                                  OrderId = grouped.Key.OrderId,
                                  OrderDate = grouped.Key.OrderDate
                                  Shipping = grouped.Key.Shipping
                                  .
                                  .
                                  .
                                  Count = grouped.Count() 
                              };

EDIT Linqpad program for similar query on in memory collection of objects

void Main()
{
    var orders = new List<Order>{
        new Order{OrderId = 1, DeliverIn = 5},
        new Order{OrderId = 2, DeliverIn = 6},
        new Order{OrderId = 3, DeliverIn = 5},
    };

    var lines = new List<OrderLine>{
      new OrderLine{LineId = 1, OrderId = 1, ProductId = 1},
      new OrderLine{LineId = 2, OrderId = 1, ProductId = 2},
      new OrderLine{LineId = 3, OrderId = 1, ProductId = 3},

      new OrderLine{LineId = 4, OrderId = 2, ProductId = 1},
      new OrderLine{LineId = 5, OrderId = 2, ProductId = 3},
      new OrderLine{LineId = 6, OrderId = 2, ProductId = 4},
    };

    var query = from o in orders join l in lines on
            o.OrderId equals l.OrderId
            group o by o into grouped
            select new 
            {
                Count = grouped.Count(),
                grouped.Key.OrderId,
                grouped.Key.DeliverIn
            };
            Console.WriteLine(query);
}

// Define other methods and classes here
public class Order
{
    public int OrderId{get;set;}
    public int DeliverIn{get;set;}

}

public class OrderLine
{
    public int LineId{get;set;}
    public int OrderId{get;set;}
    public int ProductId{get;set;}
}

and if you don't have linq pad simply go and grab it from their site . It is simply awesome.

Check out IGrouping documentation on MSDN.

public interface IGrouping<out TKey, out TElement> : IEnumerable<TElement>, 
IEnumerable

Pay attention to IEnumerable . Count is just an extension method of IEnumerable. You can easily Select from grouping or loop through it.

For example:

var Q = from Data in Context.Orders
    join D2 in Context.OrderDetails on Data.OrderID equals D2.OrderID
    group Data by Data.OrderID into grouped
                   select new
                          {
                              grouped=g.Key,
                              Count = grouped.Count(),
                              Orders = grouped.ToArray() 
//you can also just return grouped itself to support lazy queries
                          };

Just flatten them into array or list and then get its count.

select new
{
    Key = g.Key,
    Orders = grouped.ToArray()
};

Then get count:

int count = result.Orders.Count; // Property of an array.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM