我很抱歉代码的数量,但很难真正解释每个类的结构,所以我希望我可以包含这么多。所以我在C#中使用Linq学习更复杂的查询。其中大多数涉及从众多嵌套对象中查询众多字段。
我的问题是弄清楚如何获取我想要的信息。例如,我现在被困住的那个促使我做出这个的,如下所示。我将查询订单ID,客户名/姓和所有处于已下订单状态的订单的总数。有许多其他生成的对象,但它们没有放置状态,所以我没有包含它们。
下面显示的当前查询返回Roger 4次,Mary返回5次。这是正确的,因为它是罗杰的4个加法和玛丽的5个加法。但是,我没有得到LastName,也没有任何关于如何汇总所有订单的线索。
当尝试使用任何类型的.Sum或.Count功能时,它无法识别它。我知道我可能没有使用我的select新语句正确地修改数据。我正在寻找一些见解,如何最大限度地减少输出的数据量以及完成累计总数的方向。
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", "msmith@gmail.com");
Customer c2 = new Customer(25, "Andy", "Johnson", "andy.johnson@gmail.com");
Customer c3 = new Customer(42, "Tim", "Clark", "tc@tc.net");
Customer c4 = new Customer(125, "Roger", "Wilson", "rogerw@zmail.com");
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);
}
可能的groupby解决方案,但现在无法提取名称。
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 :(得分: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()));
答案 1 :(得分:0)