好的,现在停留了一天,请有人伸出援助之手!
我想选择特定客户拥有的每件商品的数量,无论他们是否订购了商品。因此,如果他们没有订购它(即它不在Orders表中),那么为数量返回值0。
订单 CustomerId ItemId 数量
项 项目Id ITEMNAME
客户 客户ID 客户名称
我猜这会涉及某种子查询,但实际上并不确定。
from c in customers
join o in Orders
on c.CustomerId == o.CustomerId
select c.CustomerName, o.Quantity
where c.CustomerId == customerId
答案 0 :(得分:2)
在SQL中,这很简单:
select c.name
, i.name
, isnull(sum(o.quantity),0)
from customers c
cross join
items i
left join
orders o
on o.customerid = c.customerid
and o.itemid = o.itemid
group by
c.name
, i.name
转换为LINQ,这变为:
from c in Customers
from i in Items
join o in Orders
on new { c.Customerid, i.Itemid }
equals new { o.Customerid, o.Itemid }
into o1
from o2 in o1.DefaultIfEmpty()
group o2.Quantity
by new { CustomerName = c.Name, ItemName = i.Name }
into q
select new {
q.Key.CustomerName,
q.Key.ItemName,
Quantity = q.Sum() ?? 0
}
我希望其他人发布更简单的LINQ版本,因为这看起来非常复杂:)
答案 1 :(得分:2)
这个引起了我的兴趣所以我写了一个控制台应用程序来做它。
Andomar在我做了(+1)之前回答了一下。 这是我的独立解决方案,但非常接近他,并不简单......
class Program {
private class CustomerDto {
public int CustomerId { get; set; }
public string CustomerName { get; set; }
}
private class ItemDto {
public int ItemId { get; set; }
public string ItemName { get; set; }
}
private class OrderDto {
public int Id { get; set; }
public int ItemId { get; set; }
public int CustomerId { get; set; }
public int Quantity { get; set; }
}
private class CustomerOrderDto {
public int CustomerId { get; set; }
public int ItemId { get; set; }
public int TotalQuantity { get; set; }
}
static void Main(string[] args) {
List<CustomerDto> Customers = new List<CustomerDto>() {
new CustomerDto() { CustomerId = 1, CustomerName = "one"},
new CustomerDto() { CustomerId = 2, CustomerName = "two"},
new CustomerDto() { CustomerId = 3, CustomerName = "three"}
};
List<ItemDto> Items = new List<ItemDto>() {
new ItemDto() { ItemId = 1, ItemName = "item one"},
new ItemDto() { ItemId = 2, ItemName = "item two"},
new ItemDto() { ItemId = 3, ItemName = "item three"}
};
// customer1 has 2 orders for item 1, 0 for item 2 or 3
// customer2 has 1 order for item 2, 0 for item 1 or 3
// customer3 has 1 order for item 2, 1 order for item 3 and 0 for item 1
List<OrderDto> Orders = new List<OrderDto>() {
new OrderDto() { Id = 1, CustomerId = 1, ItemId = 1, Quantity = 3 },
new OrderDto() { Id = 1, CustomerId = 1, ItemId = 1, Quantity = 5 },
new OrderDto() { Id = 1, CustomerId = 3, ItemId = 2, Quantity = 5 },
new OrderDto() { Id = 1, CustomerId = 3, ItemId = 3, Quantity = 5 },
new OrderDto() { Id = 1, CustomerId = 2, ItemId = 2, Quantity = 5 }
};
List<CustomerOrderDto> results = (from c in Customers
from i in Items
join o in Orders on
new { c.CustomerId, i.ItemId } equals
new { o.CustomerId, o.ItemId } into oj
from o in oj.DefaultIfEmpty()
let x = o ?? new OrderDto() { CustomerId = c.CustomerId, ItemId = i.ItemId, Quantity = 0 }
group x by new { x.CustomerId, x.ItemId } into g
select new CustomerOrderDto() {
CustomerId = g.Key.CustomerId,
ItemId = g.Key.ItemId,
TotalQuantity = g.Select(x => x.Quantity).Sum()
}
).ToList();
foreach (var result in results) {
Console.WriteLine("Customer {0} purchased {1} units of item {2}",
result.CustomerId, result.TotalQuantity, result.ItemId);
}
Console.ReadKey(true);
}
}
答案 2 :(得分:2)
LINQ表达
from c in Customers
from i in Items
select ...
是所有客户和商品的cross join。所以剩下要做的就是总结每个的数量:
var result = from c in Customers
from i in Items
select new
{
Customer = c,
Item = i,
Quantity = (from o in Orders
where o.CustomerId == c.CustomerId && o.ItemId == i.ItemId
select o.Quantity).Sum(),
};
请注意,Sum
为空IEnumerable<int>
返回0(即未找到订单)。
答案 3 :(得分:1)
LINQ的
from t in Customers
join t2 in Orders on t.CustomerId equals (int)t2.CustomerId into t2Join
from t2 in t2Join.DefaultIfEmpty()
group t by t into t_g
select new
{
CustomerId = t_g.Key.CustomerId,
OrdersId = t_g.Key.OrdersId,
Quantity = t_g.Key.Orders.Where(c => c.CustomerId == t_g.Key.CustomerId)
.Sum(c => c.Quantity)
};
这未经过测试,但您可以尝试。