2011-02-06 12 views
1

LINQ式を使用して2番目の部分(for/foreach)を実行する方法を見つけることができず、LINQで類似の例が見つかりませんでした。 rangeDaysは約5から200の間であり、q1はMyClassesのリストであり、RowIDは約10000から25000までで、ギャップはありません。LINQを使用して範囲を設定する

public class MyClass { public int RowID; public object otherData; } 

PopulateRange(int rangeDays, List<MyClass> q1){ 
var q2 = (from a in q1 
     let Rows = new int[rangeDays] 
     select new {a.RowID, Rows }).ToList(); 
foreach(var a in q2) 
{ 
    for(int i = 0; i < rangeDays; i++) 
    { 
     a.Rows[i] = a.RowID + i; 
    } 
} 

ありがとうございます。


更新

: は、私は(うまくいけば、これはこの時間、すべての実行可能である)は、以下に示すように、これは2つのLINQ文を実行しました。

public List<MyClass> PopulateRange(int rangeDays, IQueryable<TheirClass> q1) 
{ 
    var q2 = (from a in q1 
       select new MyClass() 
       { RowID = a.RowID, Rows = new int[rangeDays] }).ToList(); 
    q2.ForEach(a => a.Rows = Enumerable.Range(0, rangeDays). 
       Select(i => i + a.RowID).ToArray()); 
    return q2; 
} 
public class MyClass 
{ 
    public int RowID; 
    public int[] Rows; 
} 
public class TheirClass 
{ 
    public int RowID; 
    public int ID; 
    public string Symb; 
    public DateTime? EventTime; 
    public decimal? Value; 
} 

これは許容ですが、誰もが、次の単一の文は、非サポート例外スローなぜ知らない「演算子が含まれてい除いローカルシーケンスがクエリ演算子のSQL実装にLINQで使用することはできません。」私は&実行コンパイルしようとすると:

public List<MyClass> PopulateRange(int rangeDays, IQueryable<TheirClass> q1) 
{ 
    var q2 = (from a in q1 
       select new MyClass() 
     { RowID = a.RowID, Rows = Enumerable.Range(0, rangeDays). 
     Select(i => i + a.RowID).ToArray() }).ToList(); 
    return q2; 
} 
+1

何か問題はありません。 'q1'は' List 'であるはずなので、' int'は 'RowID'プロパティをどのように持っていますか? – Gabe

+0

...「行」はどこから来たのですか? –

+0

@Jon Skeet: 'Rows'は' let'節によって導入されました。 – Ani

答えて

0

を私はq1の型が実際に(それは確かにList<int>することはできません)List<MyRowClass>または類似であるべきだと思います。あなたはおそらくしたい :

var q2 = (from a in q1 
      select new 
      { 
       a.RowID, 
       Rows = Enumerable.Range(0, rangeDays) 
           .Select(i => i + a.RowID) 
           .ToArray() 

      }).ToList(); 
2

アニの答えに若干のバリエーション:

var q2 = q1.Select(a => new { Rows = Enumerable.Range(a.RowID, rangeDays) 
               .ToArray(), 
           RowID = a.RowID }); 

違い:

  • 単一選択がそこだとき、私は、クエリ式の構文を気にしないでください
  • 0からRangeを選択してSelectを使用するのではなく、a.RowIDから始めるほうが簡単だと思いました。
+0

+1:あなたが言及しているのはどちらも真実ですが、私はOPのコード、特にループの「文字通りの」変換をしようとしていました。 – Ani

+0

あなたはどちらも正しいです、私はクラス(new {int、object})を持っていました。 "NotSupportedExceptionが発生しました。 クエリ演算子 'Range'はサポートされていません。 メッセージクエリ演算子 'Range'はサポートされていません。しかし、LinqPadにあります。私はすぐにVSで実行を設定します。 – Gary

+0

@Gary:それはかなり奇妙です...しかし、私はちょうど、元のコードに従って 'int'から' RowID'を取得しようとしていることに気づいたので、あなたには何も言わないでしょう。 .. 'q1'は実際にはデータベースクエリですか? –

関連する問題