2016-04-13 13 views
4

Iは測定が単一のテーブルに保存され、そこからオブジェクトを持っています。ある期間内にオブジェクトが一定の状態になっている期間を調べたいと思います。LINQは、各マッチング結果と次のレコードを選択

ので、希望の状態でレコードを取得に加えて、私はそれらの間の時間を計算するために、同じオブジェクトから作られた次の測定でそれをペアリングする必要があります。

私はこの怪物を思い付いた:

// Get the the object entry from Database 
MeasuredObject object1; 
try 
{ 
    object1 = (MeasuredObject)(from getObject in db.MeasuredObject where wantedObject.Id.Equals(getObject.Id) select getObject).Single(); 
} 
catch (System.ArgumentNullException e) 
{ 
    throw new System.ArgumentException("Object does not exist", "wantedObject", e); 
} 

// Get every measurement which matches the state in the time period and the next measurement from it 
var pairs = (from m in object1.Measurements 
      join nextM in object1.Measurements 
      on (from next in object1.Measurements where (m.Id < next.Id) select next.Id).Min() equals nextM.Id 
      where 'm is in time period and has required state' 
      select new { meas = m, next = nextM }); 

が、私はこれは私がCompact Editionの3.5を使用している場合は特に、非常に効率的ないないようだと言うでしょう。

メートルを通じて次の測定にナビゲートする方法はありますか私は何とかのorderby使用することができますまたはグループは、Idで次を選択しますか?あるいは、結合節をよりシンプルにすることさえできますか?あなたは、メモリのコレクションで作業しているように掲示コードから

+0

、これはエンティティへのオブジェクトへのLINQ、またLINQではありませんが、LINQ to SQLは?そして 'Measurements'はある種の' IQueryable'であり、LINQクエリ全体がSqlServerデータベース内でSQLクエリとして実行されますか? –

+0

私はまだLINQのさまざまな使い方について混乱しています...オブジェクト1はデータベースから取得されています。私は質問にobject1の呼び出しを追加します。しかし、Measurementsは、データベースのobject1への外部キーを持つSQLテーブルです。だから私はこれがLINQ to SQLだと思う。 – Silvyrfir

+0

ええ、私はそれが混乱していることを知っているが、それは現実だ。また、さまざまなソースにはさまざまなソリューションが必要です。ここで最も重要なのは、 'object1.Measurements'プロパティの**タイプ**です。 'IEnumerable '。 'IQueryeble 'など –

答えて

1

が見えます。それが本当ならば、次は十分なものでなければならない:

var items = (from m in object1.Measurements 
      where 'm is in time period and has required state' 
      orderby m.Id 
      select m) 
      .ToList(); 

var pairs = items.Select((item, index) => new 
      { 
       meas = item, 
       next = index + 1 < items.Count ? items[index + 1] : null 
      }); 

EDIT:上記のそれはアイテムをペアリングする前にフィルタを適用するため、コードの完全に同等ではありません。正確な最適化された同等のは次のように次のようになります。ただ、明確にするため

var items = object1.Measurements.OrderBy(m => m.Id).ToList(); 

var pairs = items.Select((item, index) => new 
      { 
       meas = item, 
       next = index + 1 < items.Count ? items[index + 1] : null 
      }) 
      .Where(pair => 'pair.meas is in time period and has required state'); 
+0

ここでデータ[]は何を指していますか? – Silvyrfir

+0

申し訳ありません、それは 'items'です。これは、VSの外で変数の名前を変更するときに起こります:) –

+0

申し訳ありません:)私は非常にそこに失われていた。 – Silvyrfir

関連する問題