1

私は3つのテーブルを持っています。

  • ユーザー (フィールド: ユーザー ID と名前)
  • MonthsMap (フィールド: UserId、Month、orderId)
  • OrderTable (フィールド: OrderId、注文数量など)

私の要件は次のとおりです。

ユーザーが 11 月の注文を持っている場合は 11 月の注文を表示し、それ以外の場合は 10 月の注文を表示します。

現在、私がやっていることは

foreach(user)
{
    join User table with MonthsMap table where month = november
    if( result is null )
    {
        join User table with MonthsMap table where month = october join order table to get October order details
    }
    else
    {
        join User table with MonthsMap table where month = november join order table to get november order details
    }
}

各ユーザーの繰り返しに使用される for ループのように、多くの時間がかかります。Linq to SQL を使用していますが、単一のクエリですべてのユーザーの注文を取得するために使用できるより良い Linq オプションはありますか。

すべての回答に感謝しますが、私の例があなたを少し混乱させて申し訳ありません。正確なシナリオはこのようなもので、ユーザーはさまざまなタイプの注文 (例: 通常の注文と緊急注文) を持つことができます。したがって、months_map テーブルの代わりに、オーダー マップ テーブルを使用します (フィールド ユーザー ID、order_type("通常/緊急/非常に緊急")、order_id)

したがって、私のアプリケーションでは、すべてのユーザーの注文をユーザー テーブルに一覧表示する必要があります。

リスティングは、

  • ユーザーが非常に緊急の注文をしている場合、アプリケーションは非常に緊急の注文のみを表示する必要があります
  • それ以外の場合、ユーザーが緊急の注文を持っている場合、アプリケーションは彼の緊急の注文のみを表示する必要があります
  • それ以外の場合、ユーザーが通常の注文をしている場合、アプリケーションは通常の注文のみを表示する必要があります
  • それ以外の場合は、ユーザー名のみを表示し、注文の詳細は空白のままにします。
4

3 に答える 3

0

このSQLを試してください

select ot.*
  from OrderTable ot, MonthsMap mm
 where ot.orderid = mm.orderid
   and mm.userid = :userid
   and mm.month = case
           when (select count(*)
                   from MonthsMap mm1
                  where mm1.userid = mm.userid
                    and mm1.month = 'november') > 0 then
            'november'
           else
            'october'
       end;
于 2013-11-13T13:10:58.437 に答える
0

正確には10月/11月ではなく、共通の先月/前月が必要だと思います。その場合は、次のアルゴリズムを使用します
。Select * from Users/MonthMap/OrdersTable の内部結合。ここで、OrderTable.MonthNo = 現在のユーザーの OrderTable.MonthNo の最大値。

var result =
    from u in users
    join mm in mms on u.UserId equals mm.UserId
    join ot in ots on mm.OrderId equals ot.OrderId
    where mm.MonthNo == (
                            from mm1 in mms
                            where mm1.UserId == u.UserId
                            select mm1.MonthNo
                        ).Max()
    select new {u, mm, ot};
于 2013-11-13T12:50:00.020 に答える