2016-09-22 4 views
2
var testingAll =   (from ac in metaData.AcTable 
          where ac.Call >= DateTime.Now.AddMonths(-2) && ac.Call <= DateTime.Now 
          group adminCall by ac.LanguageCode into acc 
          select new { lang = acc.Key, count = acc.Count() }).ToDictionary(x => x.lang, y => y.count).OrderByDescending(x => x.Key); 

datetime 이후에 필터를 다시 사용할 수 있습니까? 이 같은linq 쿼리로 그룹 필터링

뭔가 :

var Today = testingAll.Where(/*x => x.Call >= DateTime.Now.AddDays(-2)*/) 
+1

왜 그것을 밖으로 시도하지? – HimBromBeere

+1

내가 말할 수있는 것은'lang'과'count'를 포함하는'Dictionary' 객체만을 가지고 있기 때문에'Call' 값은 더 이상 존재하지 않습니다 ... 그래서 대답은 no가 될 것입니다 – musefan

+1

저는 믿을 수 없습니다 당신은'Key'와'Count'를 내보낼 수 있습니다. 그리고 왜 그 필터를 첫 번째'linq'에 두지 않습니까? – Prisoner

답변

1

난 당신이 당신이 다음 번을 조회 할 수 있습니다 컬렉션을 다시 제공해야

var testingAll =   (from ac in metaData.AcTable 
          where ac.Call >= DateTime.Now.AddMonths(-2) && ac.Call <= DateTime.Now 
          group adminCall by adminCall.LanguageCode into ac 
          select ac 

뭔가를하려는 생각합니다.

+0

간단한 예를 들어 주시겠습니까? Where 절을 사용하여 예제를 필터링하는 방법? –

0

짧은 대답은 이 할 수 없다는 것입니다. 이 방법으로 생각하면 문제는 수업 시간에 아이들의 평균 나이를주고 그 숫자를 복용하고 남학생의 평균 나이를 알아 내려고하는 것과 똑같습니다. 소스 데이터 없이는 불가능합니다. .

수식을 작성하고 거기에 많은 노력을 기울임으로써이 작업을 수행 할 수 있지만 여전히 데이터베이스를 다시 쿼리해야합니다.

당신이 정말로 추상적 원하는 경우 멀리 약간, 당신은 매개 변수로 어디 술어를받는 함수 만들 수 있습니다

public IEnumerable<KeyValuePair<string, int>> GetFilteredCalls(
    Expression<Func<Call, bool>> predicate) 
{ 
    return calls 
     .Where(predicate) 
     .GroupBy(c => c.LanguageCode) 
     .Select(g => new { Lang = g.Key, Count = g.Count() }) 
     .ToDictionary(x => x.Lang, y => y.Count) 
     .OrderByDescending(x => x.Key); 
} 

을 그리고 당신은 다음과 같이 사용 :

var calls = GetFilteredCalls(c => c.Call >= DateTime.Now.AddMonths(-2) 
            && c.Call <= DateTime.Now); 

var moreCalls = GetFilteredCalls(c => c.Call >= DateTime.Now.AddDays(-2) 
            && c.Call <= DateTime.Now);