2011-12-21 4 views
3

LINQ를 사용하여 명령문별로 그룹을 만들려고합니다. 오류가 발생했습니다. 'con'이라는 이름이 현재 컨텍스트에 없습니다.'con'이름이 현재 컨텍스트에 없습니다.

선택 후 코드에서 ActivityID 값을 얻으려고하지만 'con'목록을 사용할 수 없습니다.

List<Contribution> contributions = 
    contLogic.GetAllContibutionsByActivityIDToList(ActivityID); 

var groups = from con in contributions 
      group con by con.Response 
      into gResponse 
      select new 
      { 
       grop = gResponse.Count(), 
       con.ActivityID 
      }; 

나는 Microsoft 샘플을보고 있으며, 내가 뭘 잘못했는지 모른다.

마이크로 소프트 샘플 :

List<Product> products = GetProductList(); 

var orderGroups = from prod in products 
        group prod by prod.Category into prodGroup 
        select new { Category = prodGroup.Key, Products = prodGroup }; 

ObjectDumper.Write(orderGroups, 1); 
+0

을 할 수있는 (이 당신을 위해 의미가 있을지 모르겠어요)? –

답변

10

con은 그룹화 할 수 없습니다. Microsoft 예제에서 원래 쿼리 요소는 prod 이었지만 그룹화 후에는 prodGroup을 참조했습니다.

귀하의 질의는 공통적 인 내용 인 Response을 기반으로 요소를 그룹화하고 있으므로 귀하는 본질적으로 더 큰 전체에 대해 개별적으로 "손실"됩니다. 당신은

group by new { con.Response, con.ActivityID } 

처럼 응답보다 더 많은 기준을 포함하도록 그룹을 확장 한 후 내부 아마도 아마도

gResponse.Key.ActivityID 

또는를 통해 ID로 요소의 ActivityID에 액세스를 참조해야 할 수도 있습니다 각 그룹

gResponse.First().ActivityID 

달성하려는 목표에 대해 더 이상의 정보가 없으면 구체적인 조언을 드릴 수 없습니다. 어떻게 진행해야하는지.

+0

.First() 예제에 bravo가 있습니다. 나는 이것이 가능하다는 것을 깨닫지 못했다. 이 방법을 사용하여 그룹 투영 내에서 값을 조건부로 검사 할 수있었습니다. – SwampyFox

1

당신 때문에 범위에 새 생성자 내에서 con에 액세스 할 수 없습니다. 필요한 데이터에 액세스하려면 gResponse을 사용해야합니다.

gResponse을 부품 합계로 생각하십시오. select new을 수행 할 때 액세스해야하는 모든 항목이 포함되어 있는지 확인하십시오.

19

into 절은 쿼리 계속 절인입니다. 쿼리 연속 은 범위에서 이전의 모든 범위 변수를 제거한 다음 에 새로운 범위 변수을 도입합니다.

이는 완전히 명확하지 않을 수 있습니다. 더 잘 보여주는 예제를 만들어 보겠습니다.

갈색 눈동자입니다. 내 동생은 파란 눈을.니다. 우리가 저처럼 모든 사람들을 찾고 싶다고 가정 해 봅시다 : 파란 눈을 가진 형제들과 함께 갈색 눈을 가진 사람들. 다음과 같이 할 수 있습니다.

var parentsWithABlueEyedChild = 
    from parent in parents 
    where parent.Children.Any(c=>c.EyeColor == Blue) 
    select parent; 

var brownEyedChildren = 
    from parentWithABlueEyedChild in parentsWithABlueEyedChild 
    from child in parentWithABlueEyedChild.Children 
    where child.EyeColor == Brown 
    select child; 

좋아, 두 가지 질문이 있습니다. 두 번째 쿼리는 첫 번째 쿼리의 결과 인 에서 작동합니다. 자, 여기서 "부모"가 두 번째 쿼리의 범위에 있지 않다는 것에 동의합니다. 맞습니까? "상위"범위 변수는이를 선언 한 쿼리 내에서만 의미가 있습니다.

당신은 같은 하나 개의 쿼리에이 두 쿼리를 결합 할 수 있습니다 : 다시

var brownEyedChildren = 
    from parentWithABlueEyedChild in (
     from parent in parents 
     where parent.Children.Any(c=>c.EyeColor == Blue) 
     select parent) 
    from child in parentWithABlueEyedChild.Children 
    where child.EyeColor == Brown 
    select child; 

, 그것은 "부모"오른쪽 "내부"쿼리 만 범위에 있음을 여기에 분명하다?

그러나이 구문은 첫 번째 구문과 비교하여 읽기가 어렵습니다. "parentWithABlueEyedChild"가 사용되기 전에 세 줄 소개 된 이유는 무엇입니까? 첫 번째 버전이 더 명확했습니다. 처음 두 버전과 정확히 일치

var brownEyedChildren = 
    from parent in parents 
    where parent.Children.Any(c=>c.EyeColor == Blue) 
    select parent into parentWithABlueEyedChild 
    from child in parentWithABlueEyedChild.Children 
    where child.EyeColor == Brown 
    select child; 

를 : 쿼리 연속으로 첫 번째 버전의 가독성을 유지하면서 우리는 하나 개의 쿼리에이를 수 있습니다. 계속은 단지 편의입니다. parent은 두 개의 쿼리로 작성한 경우 범위에 포함되지 않기 때문에 continuation 절의 범위에 포함되지 않습니다.

"con"이 (가) 계속되는 범위에 포함되지 않은 이유는 지금 명확합니까? 귀하의 질의

var q = 
    from con in contributions 
    group con by con.Response 
    into gResponse 
    select new 
    { 
     grop = gResponse.Count(), 
     con.ActivityID 
    }; 

정확히

var gResponses = 
    from con in contributions 
    group con by con.Response; 
var q = 
    from gResponse in gResponses 
    select new 
    { 
     grop = gResponse.Count(), 
     con.ActivityID 
    }; 

과 동일하다 "사기"는 두 번째 쿼리 내부의 범위에 포함되지이다; 첫 번째 쿼리의 일부일뿐입니다. 당신이 group <something> by <function of something> into <group_variable>을 수행하면

+0

잘 설명되어 있습니다. :) –

+3

이 개념을 설명하는 훌륭한 예입니다. 비록 내가 그 개념을 이해했지만, 나는 다른 누군가에게 설명하는 법을 알지 못했다. 이제 나는이 답을 지적 할 수 있습니다. 에릭, 분명히 당신은 위대한 프로그래머지만 나는 개인적으로 당신이 더 훌륭한 교사/커뮤니 케이터라고 생각합니다. 우리를 가르쳐 주셔서 감사합니다. – SolutionYogi

+0

@ Solutions Yogi : 종류의 단어를 가져 주셔서 감사합니다. –

0

는 원래 범위 변수 <something>를 더 이상 사용할 수 없습니다 - 모든 something의 그 모든 그래서 얘기가, group_variable의들로 분류되고있다. 당신의 예에서

, 당신은 기부금의 부하로 시작하지만 다음 그룹 그들을 - 지금 당신은 가 각각의 그룹하는 Key (그룹에 사용되는 Response 그들)와 시퀀스의 부하를 기부금 중. 당신이 그룹의 공헌의 첫 번째의 ActivityID을 복용 행복 경우 어디 CON을 인스턴스화하는 당신이

select new 
{ 
    grop = gResponse.Count(), 
    ActivityID = gResponse.First().ActivityID 
} 
관련 문제