CustomersとOrdersの2つのテーブルがあります。 LINQクエリで、すべての顧客によって行われたすべての注文のリストを最初に月ごとに、次に年ごとに整理したいと考えています。お客様に対応する注文がない場合は、「注文なし」と表示されます。
Customersテーブルの列は
customer_id
name
city
Ordersテーブルの列は
order_id
order_date
order_total
customer_id
次のように書いてみましたが、完全な出力は得られません。
var res = from cust in db.Customers
join ord in db.Orders
on cust.customer_id equals ord.customer_id into g
from d in g.DefaultIfEmpty()
select new {
name=cust.name,
oId=d.order_id==null?-1:d.order_id
};
どうすれば修正できますか?
私はついに正しい答えを得ました。それはまさに期待通りの結果です。下に置いておきます。ただし、2つのLINQクエリを使用して結果に到達しました。最初の結果は結果を示しますが、最終結果は顧客の名前とそれらの注文合計で表示する必要があるため、部分的な結果になります。 2番目のLINQクエリは、 'partialResult'をさらに絞り込み、期待どおりの結果を提供します。
var partialResult = (from c in db.Customers
join o in db.Orders
on c.customer_id equals o.customer_id
select new
{c.name,
o.order_total,
o.order_date }).OrderBy(m => m.order_date.Month).ThenBy(y => y.order_date.Year);
var finalResult = from c in db.Customers
orderby c.name
select new
{
name = c.name,
list = (from r in partialResult where c.name == r.name select r.order_total).ToList()
};
foreach (var item in finalResult)
{
Console.WriteLine(item.name);
if (item.list.Count == 0)
{
Console.WriteLine("No orders");
}
else
{
foreach (var i in item.list)
{
Console.WriteLine(i);
}
}
}
このようなもの。 LINQ述語を使用してそれを行うことができます
var res = Customers.Join(Orders, x => x.customer_id, y => y.customer_id, (x, y) => x).ToList();
これはあなたができることです:
var res = from cust in db.Customers
join ord in db.Orders
on cust.customer_id equals ord.customer_id into g
from d in g.DefaultIfEmpty()
orderby d.OrderDate.Year, d.OrderDate.Month
select new {
name=cust.name,
oId = d.order_id.ToString() ?? "No Orders"
};