2009-06-05 30 views
3

想像すると2つのテーブルがあります。LINQ To SQLサブSELECTのようなクエリ

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

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

オーダーは、OrderStatusHistoryと呼ばれる複数のOrderStatusを持つことができます。 私は、OrderオブジェクトのこのStatusIdは、オーダーステータス表から現在の(最後の)StatusIdであることを意味する

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

を次のようにdescriptedさStronglyTypeObject 注文を、持っています。

LINQでIQueryableオブジェクトリストを構築しようとしました。ここで私の、動作していない;)、LINQのコード私もマックス(P => p.XXX)で作業しようとしているが、それは働いていない

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 
      } 

。 誰かがこの問題に関するヒントを持っていますか?

任意のヘルプははるかに高く評価されるだろう

...

ゴードン

+0

これは私がLinqと類似のORMソリューションを批判してきた理由の例です。ここでは、よく知られており、かなり確立された言語でかなり簡単な解決策を持つ問題があります。理論的な利点を得るために、あなたは本当の生産性をあきらめています。 Linqから得た利益は、データを照会する冗長な(そして特異な)方法を学ぶために必要な時間を上回っていますか?議論については、http://stackoverflow.com/questions/458802/doesnt-linq-to-sql-miss-the-point-arent-orm-mappers-subsonic-etc-sub-optiを参照してください。 –

答えて

2

ベースあなたのコメントでは、私はFirstを使用するように以下を更新しました。その場合、OrderByDescendingをキー上で適切な順序で取得する必要があります。あなたはFKの関係が定義されている場合にも

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 
     } 

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

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

var currentStatus = order.CurrentStatus; 

public partial class ORDER 
{ 
    public int64 CurrentStatus 
    { 
     get 
     { 
      return this.OrderStatuses.Last().StatusId; 
     } 
    } 
} 
+0

あなたの非常に有益な答えをありがとう。 LINQクエリのロジックから、私はあなたのようにそれを書いていました。私が今問題を抱えているのは、そのステートメントがSystem.NotSupportedExceptionをスローしているということです。 Queryoperator "Last"はサポートされていません。それはわかりません。 – Gordon

+0

さて、OrderByDescendingとFirstを代わりに使用してください。私は更新します。 – tvanfosson

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() 
     } 
+0

それは私が使っていたのと同じアプローチです。 OrderStatusテーブルからMax()StatusIdを選択します。問題は、OrderStatusが 1 = order_received、 2 = order_payed、 3 = order_shipped、 4 = order_changedになる可能性があると言います。 StatusIdが4に設定された後、変更の支払いが繰り返されると、セールス担当者の仕事の後で再び2に変更されます。この例では、クエリは常に4を与えます。それが私が最後のStatusIDを得るためにLast()を使用していた理由です。 – Gordon

+0

例外をスローする "System.NotSupportedException:QueryOperator" Last "はサポートされていません"。何か案は? – Gordon