簡體   English   中英

實體框架Linq,左聯接和SUM和Count分組

[英]Entity Framework Linq, Left Join and group with SUM and Count

在將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中看到過一些示例,其中從組鍵中選擇了返回的字段。 這是否意味着,如果我在customers表中有更多字段想要返回,例如地址和其他聯系方式,則必須將它們包括在聯接中才能選擇它們? 希望這是有道理的。 感謝任何可能幫助我指出正確方向的幫助或鏈接。

謝謝

這是樣本

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; }
    }

結果 在此處輸入圖片說明

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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM