Entity Framework Linq,左连接和使用SUM和Count进行分组

3

我需要一点帮助将SQL转换为Linq。在MySQL中,这相当直观...

Table: customers
ID  Name    
1   Bill
2   John

Table: purchases
ID  CustomerID  CompletedTransaction
1   1           False
2   2           True
3   1           True
4   1           True


    SELECT  c.ID
        c.Name,
        COUNT(p.ID) AS TotalPurchases,
        SUM(CASE WHEN p.CompletedTransaction = TRUE THEN 1 ELSE 0 END) AS                       TotalCompleted
    FROM customers c
    LEFT JOIN purchases p ON c.ID = p.CustomerID
    GROUP BY c.ID

Expected Result:
1, Bill, 3, 2
2, John, 1, 1

我看过一些使用Linq实现左连接的例子,但不确定如何在其中包含SUM和Count。我在Linq中看到的示例是选择从组键中返回的字段。这是否意味着如果我在客户表中有更多字段,例如地址和其他联系详细信息,我需要将它们包含在连接中才能选择它们?希望这样说得清楚。感谢任何可以帮助或指向正确方向的链接。

谢谢。

2个回答

4
var answer = (from c in db.customers 
              join p in db.purchases 
              on c.ID = p.CustomerID into subs
              from sub in subs.DefaultIfEmpty()
              group sub by new { c.ID, c.Name } into gr
              select new {
                  gr.Key.ID,
                  gr.Key.Name,
                  Total = gr.Count(x => x != null),
                  CountCompleted = gr.Count(x => x != null && x.CompletedTransaction)
              }).ToList();

1
这是一个示例。
class Program
    {
        static void Main(string[] args)
        {

            List<Customers> customers = new List<Customers>();
            customers.Add(new Customers() { ID = 1, Name = "Bill" });
            customers.Add(new Customers() { ID = 2, Name = "John" });

            List<Purchases> purchases = new List<Purchases>();
            purchases.Add(new Purchases() { ID = 1, CustomerID = 1, CompletedTransaction = false });
            purchases.Add(new Purchases() { ID = 2, CustomerID = 2, CompletedTransaction = true });
            purchases.Add(new Purchases() { ID = 3, CustomerID = 1, CompletedTransaction = true });
            purchases.Add(new Purchases() { ID = 4, CustomerID = 1, CompletedTransaction = true });

            IEnumerable<JoinResult> results = from c in customers
                                       join p in purchases
                                       on c.ID equals p.CustomerID
                                       group new { c, p } by new {p.CustomerID, c.Name} into r
                                       select new JoinResult
                                       {
                                           CustomerID = r.Key.CustomerID,
                                           CustomerName = r.Key.Name,
                                           TotalPurchases = r.Count(),
                                           TotalCompleteTransaction = r.Where(s=> s.p.CompletedTransaction).Count()
                                       };

            foreach(JoinResult r in results)
            {
                Console.WriteLine($"CustomerID : {r.CustomerID} | Name : {r.CustomerName} | TotalPurchases : {r.TotalPurchases} | TotalCompleteTransaction : {r.TotalCompleteTransaction}");
            }

            Console.ReadKey();
        }
    }

    class Customers
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }

    class Purchases
    {
        public int ID { get; set; }
        public int CustomerID { get; set; }
        public bool CompletedTransaction { get; set; }
    }

    class JoinResult
    {
        public int CustomerID { get; set; }
        public string CustomerName { get; set; }
        public int TotalPurchases { get; set; }
        public int TotalCompleteTransaction { get; set; }
    }

结果 在此输入图片描述


谢谢您提供这个代码,尽管它看起来是内连接而不是左连接。 - Michael B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接