2011-08-24 4 views
3

내가 목록 < 내부에 행에서 3 개 필드를 검색 할> 순간에 나는이 잘 작동이람다 표현식

FOS1 = (from res in sortedSearchResults 
where Convert.ToInt32(res.tID) == tID 
select res.FOS1).First(); 
FOS2 = (from res in sortedSearchResults 
where Convert.ToInt32(res.tID) == tID 
select res.FOS2).First(); 
FOS3 = (from res in sortedSearchResults 
where Convert.ToInt32(res.tID) == tID 
select res.FOS3).First(); 

처럼 그 일을하고 값, 그러나 나는 대신 할 3 문장, 난 단 1,하지만 난 아주 람다 표현식에 익숙하지 않다.

나는 다음과 같은 시도 : -

var name = sortedSearchResults.Where(i => Convert.ToInt32(i.tID) == tID) 
.Select(i => new { FOS1 = i.FOS1, FOS2 = i.FOS2, FOS3 = i.FOS3 }); 

하지만 그들 값이있을 가정 할 때 FOS1, FOS2 및 FOS3은 항상 비어 있습니다. 누군가 내가 뭘 잘못하고 있는지 말해 줄 수 있습니까?

+1

"이름"유형을 읽는 방법, 즉 FOS1, FOS2 및 FOS3 회원이 비어 있는지 확인하는 방법을 보여주는 코드를 추가 할 수 있습니까? 또한, 원래 res.tID = tID에 대한 여러 결과 중 첫 번째 만 사용한다는 것을 알았습니까? –

+0

나는 3 개의 변수 대신 i를 선택하고 name.PrimaryKey와 name.FOS1, name.FOS2 및 name.FOS3을 작성하여 그 내용을 확인합니다. 새로운 객체를 정의 할 필요가없는 것처럼 보입니다. – Narnian

+0

이 Christian.K에 동의하면'name'은 익명 형식의 IEnumerable입니다. 첫 번째 행뿐만 아니라 우리가 볼 수있는 코드가 올바르게 보입니다. – Jodrell

답변

3

당신의 선택 투사가 올바른 보이는 당신의 도움과 시간을

감사합니다. 내가주의하는 유일한 것은 별도의 진술에서, 당신은 당신이 결합 된 쿼리에서 그렇게하지 않는 곳을 호출하고 있다는 것입니다. 조합 된 쿼리에서 기대했던 것보다 많은 레코드를 반환하고 가능한 한 반복하지 않을 가능성이 있습니다.

또한 First는 열성로드 구문 (로드 강제) 인 반면 Select는 지연 평가입니다. 반복이 발생하기 전에 컨텍스트가 범위를 벗어나면 빈 결과 집합을 얻게됩니다. 이는 Using 블록에 객체 컨텍스트를 래핑하고 use block의 범위 밖에서 실제 databinding 반복이 발생하는 경우에 종종 발생합니다. 로드를 강제 실행하려면 결합 된 쿼리의 끝에 .ToList()를 추가해야 할 수도 있습니다.

0

제가 이해하는 것처럼, FOS1, FOS2 및 FOS3은 값으로 채우기를 원하는 세 개의 로컬 변수입니다.

sortedSearchResults.First(i => Convert.ToInt32(i.tID) == tID) 
.Each(i => 
{ 
FOS1 = i.FOS1; 
FOS2 = i.FOS2; 
FOS3 = i.FOS3; 
}); 

을 또는, 당신은 단지 개체를 선택하고 속성을 기반으로 변수를 채울 수 :

당신은 그런 식으로 뭔가를 시도 할 수 있습니다.

1

평가를 강제해야합니다.

var name = sortedSearchResults.Where(i => Convert.ToInt32(i.tID) == tID).Select(i => new {FOS1 = i.FOS1, FOS2 = i.FOS2, FOS3 = i.FOS3}).First(); 
0

나는 그것을 해결할 수 있었고 그것은 나빴다. 우선 나는 성명서 끝에()를 쓰고 이름을 FOS1과 FOS2라고 부르지 않으면 안된다 .FOS3. 또한 결과 집합은 이전에 코드에서 이미 필터링되어 sortedResults를 가져 오기 때문에 항상 1 행을 포함합니다. 모든 도움에 감사드립니다! -