앞에 포스팅했던 LINQ to Object 이어서 줄줄 입니다.

이번에는 간단하게 SubQuery에 대해 볼께요.
그냥 쿼리 안에 쿼리가 있는건데
T-SQL에서도 조건에 쿼리를 붙이고 하는걸 LINQ로 하면요

           string[] names = { "Tom", "Bill", "Harry", "June", "Mary", "Jay" };

            var r01 = from x in names
                      where x.Length == (
                                          from y in names
                                          orderby y.Length
                                          select y).First().Length
                      select x;

            foreach (var x in r01)
            {
                Console.WriteLine(x);
            }

그냥.
names에서 x라는 녀석을 가져오는데

(여기부터가 subQuery죠)
(다시)
names에서 y라는 녀석을 가져오는데
y의 길이로 정렬을 해서
가져온후에
첫번째 녀석(First())의 길이를 가져온다    << 이녀석이 x의 조건이 되는거에요
(subQuery끝)

이 길이의 x를 가져온다...

가 되는거죠.
정렬에 따로 말이 없으면 ascending이므로
Tom인지  Jay인지는 모르겠지만 암튼 둘중 하나가 First가 되겠죠.
그녀석의 길이와 같은 x를 가져오는것이니

출력값은????
이렇게 나오네요.

이번엔 into에 대해 살펴보죠(헥헥헥)
into키워드는 group, join, select 같은 임시 저장 식별자를 만들어 주는건데요.

예제를 보는게 이해가 빠를꺼에요.

                      var r01 = from x in names
                      where x.Contains("a")
                      select x
                          into subSet
                          where subSet.Length > 4
                          orderby subSet
                          select subSet;


(제가 이해한게 맞다면)
into는 (단어 뜻 그대로)
into키워드 앞의 결과를 뒤에 넣어주는거죠
코드를 보면
x를 subSet에 into했네요.
그 다음에 subSet을 가지고
조건을 걸어서(정렬조건도)
select~

그럼 결과는 어떻게 나올까요?
이름에 "a"가 들어간 놈을 찾아서 나온 결과들중에서(이게 x)
길이가 4 이상인 녀석들을 select하니까.

이렇게 나오네요.
(아마도 x에는 Harry랑 Mary랑 Jay가 있었겠죠)

into를 쓸때 주의할껀
into를 쓴 후에는
원본 x에 접근을 할수가 없다는 거에요.

원본 x에도 접근하고 싶다면
into가 아니라 let을 쓰면 되요
let키워드는 부분결과 집합을 만들어서 쿼리내에서 참조 하는겁니다

                      var r01 = from x in names
                      let temp = x.Replace("a", "")
                      where x.Contains("a")
                      select new
                      {
                          Original = x,
                          Change = temp
                      };

출력값은

간단하네요~

출처?는 김수영MVP님의 주말특강입니다
by 피요히코~ 2009. 4. 26. 19:49
| 1 |