7

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

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

4

3 に答える 3

13

私はついに正しい答えを得ました。これはまさに期待どおりの結果です。以下に載せました。ただし、結果に到達するために 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);
                    }
                }
            }
于 2013-07-26T14:12:28.437 に答える
0

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

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" 
          };
于 2013-07-23T07:23:40.423 に答える