2009-09-03 5 views
1

을 객체에LINQ 내가 특정 LINQ 쿼리 도움이 필요 쿼리

배경 정보를 (나는 아직도 그들에 빨아 '!) :

내가있어 클래스 DATAENTRY :

class DataEntry{ 
    public Attribute Attribute{get; set;} 
    public List<object> Data{get; set;} 

을 클래스 속성 : 내가 뭘 결국해야하는 ENTR 당 약 1000 데이터 객체에 대한 ~ 20 개의 데이터 항목입니다

class Attribute{ 
    public string FeatureName{get; set;} 
    public Types FeatureType{get; set;} 
    public List<object> PossibleValues{get; set;} 

와이. 필자가하려고하는 것은 LINQ 쿼리를 작성하여 FeatureType을 기반으로 특정 데이터 항목을 선택한 다음 해당 항목의 총 데이터 항목 수를 특정 값과 동일하게 계산하는 것입니다.

내가 얻으려고하는 것은 기능 유형이 "foobar"인 데이터 항목의 "높음"및 "낮음"값의 수입니다.

내가 들어 왔 가장 가까운는 다음과 같습니다

나에게 "높은"의 수를 제공하지만, featureType을 기준으로 필터링하지 않습니다
int count = dataset.SelectMany(i => i.Data).Count(j => j.ToString() == "high"); 

.

가능합니까? 단일 진술로 할 수 있습니까?

답변

3

올바른 길을 가고 있습니다. SelectMany에 먹이기 전에 Where 방법을 추가하여 물건을 걸러냅니다.

dataset.Where(i => i.Attribute.FeatureType == Types.FooBar) 
     .SelectMany(i => i.Data) 
     .Count(j => j.ToString() == "high") 

하나의 문에서 높고 낮은 계산하려면, 당신은 시도 할 수 있습니다 :

dataset.Where(i => i.Attribute.FeatureType == Types.FooBar) 
     .SelectMany(i => i.Data) 
     .Select(i => i.ToString()) 
     .Aggregate(new { High = 0, Low = 0 }, 
      (acc, i) => val == "high" ? new { High = i.High + 1, i.Low } 
         : val == "low" ? new { i.High, Low = i.Low + 1 } : acc); 
+0

깜짝이야. 나는 내 마음 속에 옳은 길을 걷고 있었지만 그것을 이해할 방법이 전혀 없다. 감사. – ahawker

+0

linq 쿼리 언어에 대한 메소드 체인을 사용하는 것이 좋습니다. –

2

또 다른 방법 :

int count = 
(from dataEntry in dataset 
    from data in dataEntry.Data 
    where dataEntry.Attribute.FeatureType == Types.Foo && data.ToString() == "high" 
    select data 
).Count();