web-dev-qa-db-ja.com

LINQクエリを使用して2つのテーブルを結合し、順序ベースの2つのパラメーター

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 
          };   

どうすれば修正できますか?

7

私はついに正しい答えを得ました。それはまさに期待通りの結果です。下に置いておきます。ただし、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);
                    }
                }
            }
11

このようなもの。 LINQ述語を使用してそれを行うことができます

var res = Customers.Join(Orders, x => x.customer_id, y => y.customer_id, (x, y) => x).ToList();
7
user4090189

これはあなたができることです:

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" 
          };
0
Gert Arnold