【发布时间】:2017-03-16 06:38:01
【问题描述】:
我很抱歉代码量很大,但是很难真正解释每个类的结构,所以我希望我包含这么多是可以的。所以我在 C# 中使用 Linq 学习更复杂的查询。其中大多数涉及从大量嵌套对象中查询大量字段。
我的问题是弄清楚如何获取我想要的信息。例如,我现在坚持的那个促使我这样做的原因如下所示。我要查询所有已下订单的订单 ID、客户名字/姓氏和总数。还有许多其他生成的对象,但它们没有放置状态,所以我没有包括它们。
如下所示的当前查询,返回 4 次 Roger 和 5 次 Mary。这是正确的,因为它是编码的,因为它们是 Roger 的 4 个加法和 Mary 的 5 个加法。但是,我没有得到姓氏,并且对于如何汇总所有订单一无所知。
当尝试使用任何类型的 .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", "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) };
【问题讨论】:
-
你从哪里得到订单2?
-
首先你有两个名为 orders 的对象(错误的编码),其次你没有得到 LastName 因为你的匿名类型有
o.OrderedBy.LastName当你将项目放入这种类型时,它已经被任何命令排序了之前orderby o.OrderDate -
@nick-s 抱歉,这是我对订单集合的初始化。现在应该正确更新代码。它只是在其中创建包含所有订单的列表,这是 SetupData2 方法,我将其称为 List orders2。
-
我找不到 setupData2() 方法!?
-
@nick-s 现在检查,格式应该是正确的。