2011-02-06 94 views
1

我无法弄清楚如何用LINQ表达式来完成这个(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; 
} 

这是可以接受的,但没有人知道为什么下面单个语句引发NotSupportedException“本地序列不能在LINQ用于查询操作的SQL实现除包含运营商。”当我尝试编译&运行:

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 2011-02-06 16:50:43

+0

......“行”从哪里来? – 2011-02-06 17:01:20

回答

0

我觉得q1的类型实际上应该是List<MyRowClass>或类似的(这当然不能是List<int>)。 你可能想:

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,然后选择,我觉得它会更容易,只需从a.RowID开始:)