2011-02-06 4 views
1

이 두 번째 부분 (for/foreach)을 LINQ 식으로 수행하는 방법을 알아낼 수 없으며 LINQ와 유사한 예제를 찾지 못했습니다. rangeDays는 약 5와 200 사이이며, q1은 RowID가 약 10000에서 25000 사이 인 간격이없는 MyClasses 목록입니다.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; 
    } 
} 

미리 감사드립니다.


업데이트

: 나는 (희망이이 시간 모든 실행 가능한 것입니다) 아래 그림과 같이이 두 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이 발생 이유를 알고 않는다 "는이 연산자를 포함 제외 지역 순서가 쿼리 연산자의 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

@ 존 Skeet : 행은'let' 절에 의해 소개됩니다. – Ani

답변

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 }); 

차이 : 단 하나의 선택이있을 때, 나는 쿼리 식 구문을 귀찮게하지 않습니다

  • Range에서 0을 선택한 다음 Select를 사용하는 대신 a에서 시작하는 것이 더 쉬울 것이라고 생각했습니다. 로우 ID :
+0

+1 : 네가 언급 한 것이 모두 사실이지만 OP의 코드, 특히 루프의 '리터럴'변환을 시도하고있었습니다. – Ani

+0

당신은 모두 정확합니다, 나는 클래스 (new {int, object})를 가졌습니다. "NotSupportedException이 발생했습니다. 쿼리 연산자 'Range'가 지원되지 않습니다. 메시지 쿼리 연산자 'Range'가 지원되지 않습니다." 그래도 LinqPad에 있습니다. 언젠가 조만간 VS에서 뛰게 될거야. – Gary

+0

@Gary : 꽤 이상합니다.하지만 원래 코드에 따라'int'에서'RowID'를 얻으려는 것으로 나타났습니다. 그래서 우리에게 말하지 않은 것이 있어야합니다. ..'q1'은 실제로 데이터베이스 쿼리입니까? –