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

Personally I'd write the query in SQL and would approach the problem something like this:

SELECT user.userid
     , user.name
     , october_orders.orderquantity
     , november_orders.orderquantity
     , Coalesce(october_orders.orderquantity, november_orders.orderquantity)
FROM   user
 LEFT
  JOIN monthsmap
    ON monthsmap.userid = user.userid
 LEFT
  JOIN ordertable As october_orders
    ON october_orders.orderid = monthsmap.orderid
   AND monthsmap.month = 'october'
 LEFT
  JOIN ordertable As november_orders
    ON november_orders.orderid = monthsmap.orderid
   AND monthsmap.month = 'november'

Have a play and see how you get on.

于 2013-11-13T12:53:14.530 回答
0

我猜你需要上个月/前几个月的共同点,而不是十月/十一月。如果是,则使用以下算法:
从 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 回答