3

2 つのテーブルがあるとします。

Order
+----------------+
| ID             |
| Name           |
+----------------+

OrderStatus
+----------------+
| ID             |
| OrderId        |
| StatusId       |
+----------------+

Order は、OrderStatusHistory と呼ばれる複数の OrderStatus を持つことができます。次のように説明されている StronglyTypeObject Orderがあります。

namespace my.project
{
    public class Order
    {
        Int64 OrderId { get; set; }
        String Name { get; set; }
        Int64 StatusId { get; set; }
    }
}

Order オブジェクト内のこの StatusId は、OrderStatus テーブルの現在の (最後の) StatusId であることを意味します。

LINQ を使用して IQueryable オブジェクトのリストを構築しようとしました。これが私の、機能していない;)、Linqコードです

var result = from r in dbContext.ORDER
             select new Order
             {
                 OrderId = r.ID,
                 Name = r.Name,
                 StatusId = dbContext.OrderStatus
                            .Where(p => p.OrderId == r.ID).Last().StatusId
             }

Max(p=>p.XXX) も試してみましたが、うまくいきませんでした。誰もこの問題についてヒントを持っていますか?

どんな助けでも大歓迎です...

ゴードン

4

2 に答える 2

2

あなたのコメントに基づいて、First を使用するように以下を更新しました。その場合、正しい順序でキーを取得するには、キーで OrderByDescending を実行する必要があります。

var result = from r in dbContext.ORDER
         select new Order
         {
             OrderId = r.ID,
             Name = r.Name,
             StatusId = dbContext.OrderStatus
                        .Where(p => p.OrderId == r.ID)
                        .OrderByDescending( p => p.ID )
                        .First()
                        .StatusId
         }

また、FK 関係が定義されている場合は、中間オブジェクトを作成せずに最後の StatusId を取得する方がはるかに簡単です。この場合、LINQToSQL ではなく LINQtoObjects を実行するため、Last (オブジェクトがプリロードされている場合) を使用できると思います。YMMV。

var currentStatus = order.OrderStatuses.Last().StatusId;

後者は、ORDER の部分クラスのメソッドとして追加して、として参照できるようにすることができます。

var currentStatus = order.CurrentStatus;

public partial class ORDER
{
     public int64 CurrentStatus
     {
         get
         {
             return this.OrderStatuses.Last().StatusId;
         }
     }
}
于 2009-06-05T12:09:18.123 に答える
1

了解しました。これはどうですか:(2つ取り、降順で最初に..トップ1を取ります)

var result = from r in dbContext.ORDER
         select new Order
         {
             OrderId = r.ID,
             Name = r.Name,
             StatusId = dbContext.OrderStatus
                                 .Where(p => p.OrderId == r.ID)
                                 .OrderByDescending(p => p.OrderID)
                                 .Select(p => p.StatusId)
                                 .FirstOrDefault()
         }
于 2009-06-05T12:00:42.010 に答える