2017-03-15 3 views
0

コードの量は申し訳ありませんが、各クラスの構造を実際に説明するのは難しいので、これを多く含めることを願っています。だから私はC#でLinqを使ってより複雑なクエリを学んでいます。それらのほとんどは、多数のネストされたオブジェクトから多数のフィールドを照会します。Linqのネストされたクラスリストからネストされた値を追加

私の問題は、私が欲しい情報を得る方法を考え出すことです。たとえば、私が今こだわっているので、これを作るよう促したのは以下の通りです。私は注文ID、顧客名/姓、およびステータスが割り当てられたすべての注文の合計を照会します。他にも多数のオブジェクトが生成されていますが、配置されていない状態なので、それらを含めませんでした。

下記の現在のクエリは、Rogerを4回、Maryを5回返します。 Rogerの4つの追加とMaryの5つの追加のためにコード化されているので正しいです。しかし、私はLastNameを取得していないし、配置されたすべての注文をどのように合算するかについてのわずかな手掛かりはありません。

.Sumまたは.Countの任意の種類を使用しようとすると、認識されません。私は、選択した新しいステートメントで正しくデータを整形していない可能性が高いことを知っています。私は、出力されるデータの量を最小限に抑える方法と、合計の合計を達成するためにどの方向に進むべきかについて、いくつかの洞察を求めています。

class Customer 
     { 
      public int CustomerID { get; set; } 
      public String FirstName { get; set; } 
      public String LastName { get; set; } 
      public String Email { get; set; } 

      public Customer(int id, String fName, String lName, String email) 
      { 
       CustomerID = id; 
       FirstName = fName; 
       LastName = lName; 
       Email = email; 
      } 
     } 
    } 

     class Order 
    { 
     public int OrderID { get; set; } 
     public DateTime OrderDate { get; set; } 
     public String ShippingMethod { get; set; } 
     public String OrderStatus { get; set; } 
     public Customer OrderedBy { get; set; } 
     public List<Product> OrderItems { get; set; } 

     public Order(int ordId, DateTime ordDate, String shipMethod, String ordStatus, Customer cust) 
     { 
      OrderID = ordId; 
      OrderDate = ordDate; 
      ShippingMethod = shipMethod; 
      OrderStatus = ordStatus; 
      OrderedBy = cust; 
      OrderItems = new List<Product>(); 
     } 

     public void addProduct(Product prod) 
     { 
      OrderItems.Add(prod); 
     } 
     public double calcOrderTotal() 
     { 

      var itemVar = OrderItems.Sum(i => i.calcProductTotal()); 

      return itemVar; 
     } 
     public double calcShipping() 
     { 
      double total = 0; 
      return total; 
     } 

    } 
} 

    class Product 
    { 
     public int ProdID { get; set; } 
     public String Name { get; set; } 
     public double Price { get; set; } 
     public String Image { get; set; } 
     public String Desc { get; set; } 
     public int QtyOrdered { get; set; } 
     public double Weight { get; set; } 

     public Product(int id, string name, double price) 
     { 
      ProdID = id; 
      Name = name; 
      Price = price; 
     } 
     public Product(int id, string name, double price, string image, string desc) 
      : this(id, name, price) 
     { 
      Image = image; 
      Desc = desc; 
     } 
     public Product(int id, string name, double price, int qty, double weight) : this(id, name, price) 
     { 
      QtyOrdered = qty; 
      Weight = weight; 
     } 
     public double calcProductTotal() 
     { 
      return Price * QtyOrdered; 
     } 
    } 
} 

    class Program 
{ 
    static void Main(string[] args) 
    { //http://msdn.microsoft.com/en-us/vcsharp/aa336746 
     List<Order> orders2 = setupData2(); 

private static List<Order> setupData2() 
     { 
    List<Order> orders = new List<Order>(); 
      Customer c1 = new Customer(14, "Mary", "Smith", "[email protected]"); 
      Customer c2 = new Customer(25, "Andy", "Johnson", "[email protected]"); 
      Customer c3 = new Customer(42, "Tim", "Clark", "[email protected]"); 
      Customer c4 = new Customer(125, "Roger", "Wilson", "[email protected]"); 

    Order ord4 = new Order(48, DateTime.Now.Subtract(new TimeSpan(4, 1, 1, 1, 1)), "Ground", "Placed", c4); 
      ord4.addProduct(new Product(129, "Do It Yourself Tornado Kit", 225.50, 4, 85.5)); 
      ord4.addProduct(new Product(421, "Catcus Costume", 48.70, 2, 18.85)); 
      ord4.addProduct(new Product(400, "Anvil", 338.70, 1, 384.25)); 
      ord4.addProduct(new Product(455, "Jet Propelled Unicycle", 556.40, 4, 328.35)); 
      orders.Add(ord4); 

      Order ord5 = new Order(55, DateTime.Now.Subtract(new TimeSpan(1, 1, 1, 1, 1)), "Ground", "Placed", c1); 
      ord5.addProduct(new Product(124, "Earth Quake Pills", 145.50, 3, 2.25)); 
      ord5.addProduct(new Product(129, "Do It Yourself Tornado Kit", 225.50, 1, 85.5)); 
      ord5.addProduct(new Product(327, "Giant Mouse Trap", 88.70, 4, 26.50)); 
      ord5.addProduct(new Product(400, "Anvil", 338.70, 2, 384.25)); 
      ord5.addProduct(new Product(425, "Iron Bird Seed", 27.70, 1, 5.85)); 
      orders.Add(ord5); } 

           var orders = (from o in orders2 
         from p in o.OrderItems 
         where o.OrderStatus == "Placed" 
         orderby o.OrderDate 
         let total = p.Price * p.QtyOrdered 
         select new { o.OrderID, o.OrderedBy.FirstName, o.OrderedBy.LastName, Total = total }); 
     double totalOrders = 0; 
     foreach (var x in orders) 
     {    
      Console.WriteLine("Order Id: " + x.OrderID + " Ordered by: " + x.FirstName + " " + x.LastName); 
      totalOrders+= x.Total; 
     } 
     Console.WriteLine("Price for all Orders: " + totalOrders); 
} 

可能なグループバイソリューションですが、現在名前を取得できません。

  var ordersTotal = from o in orders2 
          from p in o.OrderItems 
          where o.OrderStatus == "Placed" 
          orderby o.OrderDate 
          group p by o.OrderID into g 
          select new { OrderId = g.Key, Price = g.Sum(p => p.Price * p.QtyOrdered) }; 
+0

ここからorders2を取得していますか? –

+0

あなたはorder(bad coding)という名前の2つのオブジェクトを持っています.2番目にLastNameを取得していません。これは、アイテムをこのタイプに入れるときに匿名タイプが 'o.OrderedBy.LastName' o.OrderDate' – Edward

+0

@ nick-s謝罪、それは注文のコレクションの私の初期化です。コードは正しく更新されるはずです。それは、SetupData2メソッドであるすべてのOrdersを持つリストを作成するだけで、そのList orders2を呼び出しています。 –

答えて

1

このコードを試してください。

  var orders = (from o in orders2 
          where o.OrderStatus == "Placed" 
          orderby o.OrderDate 
          select new { o.OrderedBy.FirstName, o.OrderedBy.LastName }).Distinct(); 

      foreach (var x in orders) 
      { 
       Console.WriteLine(x.FirstName + " " + x.LastName); 
      } 

      Console.WriteLine(orders2.Sum(order => order.OrderItems.Select(item =>(double)(item.QtyOrdered * item.Price)).Sum())); 
+0

これはC#で 'Console.WriteLine(" {0} {1} "、x.FirstName、x.LastName); – Edward

+0

の方が良い方法です。それはちょっと醜いですが、あなたとエドワーズのコメントでは、それぞれの.addProductを印刷する問題を絞りました。私が想像するのは、foreachループの一部です。私が今行う必要があるのは、各行を一度印刷してから一番下に合計する方法を解読することです。私が今持っているものでコードを更新します。 –

+0

名前ごとに1行の意味ですか? –

0

それはあなたが和を行うことができます方法を示してコード

https://dotnetfiddle.net/91yYMF

のこの.NETフィドルを見てみましょう。何か他に何かする必要はありますか?

+0

あなたは何を言っているのかわからない、そのコードは私が投稿したものです。何も変わらず、それでも正しい情報を出力しません。 –

+0

@ The_fatness私はそれを行うための別の方法を単に示していました。「別の方法」セクションを参照してください。**正しい情報が何であるかを明確にすることを求めていましたか?**あなたがしようとしていることがわからない行う – Daveo

関連する問題