2017-10-26 10 views
0

SQLをLinqに変換するには少し助けが必要です。それはエンティティフレームワークLinq、左結合とSUMとCountを持つグループ

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が含まれており、このカウントにするかどうかはわかりません... MySQLの中ではかなりまっすぐ進むのです。 Linqでは、返されるフィールドがグループキーから選択される例を見てきました。これは、返信したい住所やその他の連絡先情報など、顧客テーブルにさらにフィールドがある場合、それらを選択して参加できるようにする必要があることを意味しますか?これが理にかなってほしい。正しい方向に向けるかもしれないヘルプやリンクを感謝してください。

おかげ

答えて

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

これは内部結合ではなく、左側に参加できますように見えますが、ここではサンプル

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

結果は、このための enter image description here

+0

おかげです。 –

関連する問題