1. Conversion operators - LINQ Result =} IEnumerable{T} - ToArray() var doublesArray = sortedDoubles.ToArray(); - * ToList() var wordList = sortedWords.ToList(); - ToDictionary() var scoreRecordsDict = scoreRecords.ToDictionary(sr =} sr.Name); - * OfType{T}() var doubles = numbers.OfType{double}();
2. Element operators - First() (from p in products where p.ProductID == 12 select p) .First(); .Single() ? - * FirstOrDefault() int firstNumOrDefault = numbers.FirstOrDefault(); .SingleOrDefault() ? - Last() - LastOrDefault() - ElementAt() (from n in numbers where n } 5 select n).ElementAt(1);
3. Generators operators - Range() From n in Enumerable.Range(100, 50) select (Number: n, OddEven: n % 2 == 1 ? "odd" : "even"); - Repeat() var numbers = Enumerable.Repeat(7, 10);
6. Sequence Operations - Concat – 지연 실행 Var allNumbers = numbersA.Concat(numbersB); Union과 비슷하나 중복 제거를 안함 - Zip – 지연 실행 Int dotProduct = vectorA.Zip(vectorB, (a, b) =} a * b).Sum(); 각 시퀀스에 인덱스를 이용해서 병합 - SequenceEqual bool match = wordsA.SequenceEqual(wordsB);
7. Query Execution - Deferred Execution 지연 실행 var q = from n in numbers select ++i; Foreach (var v in q) { Console.WriteLine($”v={v}, i={i}”); } - Forcing Immediate Execution 바로 실행 var q = (from n in numbers select ++i).ToList(); Foreach (var v in q) { Console.WriteLine($”v={v}, i={i}”); } - Reuse Query var lowNumbers = from n in numbers where n {= 3 select n;
8. Join Operations - Cross Join from c in categories join p in products on c equals p.Category select (Category: c, p.ProductName); - Group Join from c in categories join p in products on c equals p.Category into ps select (Category: c, Products: ps); - Cross Group Join from c in categories join p in products on c equals p.Category into ps from p in ps select (Category: c, p.ProductName); - Left Outer Join from c in categories join p in products on c equals p.Category into ps from p in ps.DefaultIfEmpty() select (Category: c, ProductName: p == null ? "(No products)" : p.ProductName); - Right Outer Join? 다중키인 경우? - 메뉴 항목 추가/삭제 화면에 등록 메뉴와 미등록 메뉴를 분리해서 보여주는 경우 사용
var allMenus = CMenus.CMenuList; var regMenus = new List { new CMenu{ MenuId = 1, ParentId = 0, DisplayName = "Menu1"}, new CMenu{ MenuId = 3, ParentId = 0, DisplayName = "Menu3"}, new CMenu{ MenuId = 5, ParentId = 0, DisplayName = "Menu5"}, new CMenu{ MenuId = 12, ParentId = 1, DisplayName = "Menu12"}, new CMenu{ MenuId = 14, ParentId = 1, DisplayName = "Menu14"}, }; var unregMenus = from aMenu in allMenus join rMenu in regMenus on aMenu.MenuId equals rMenu.MenuId into joiner from j in joiner.DefaultIfEmpty() where j == null select aMenu;
foreach (var menu in unregMenus) { Console.WriteLine($"{menu.MenuId}, {menu.ParentId}, {menu.DisplayName}"); }
첫댓글 좋은 자료 감사합니다. 이번 기회에 LINQ 공부 좀 해야겠네요.
감사합니다.
Dapper 쓰면서 FirstOrDefault() 즐겨 쓰게 되더군여 :)
람다식 조아요~ 쓰다보면 중독됨 ㅋ
Dapper쓰면서 FirstOrDefault() 와 SingleOrDefault() 잘구분 못하는경우가 많더라구요. ㅠㅠ
예를들어 원래 부터 결과가 top 1처럼 1개가 나와야하는데. 쿼리의 오류로 2개가 나와도 FirstOrDefault()는 오류로 처리 하지 않고.. 첫번째껄 리턴하고.. SingleOrDefault() 1개 이상이면 오류로 인식하는데..
대부분 그냥 기계적으로 FirstOrDefault()만 쓰시는 분들도 많더라구요.