EF, LINQ

냐옹·2024년 4월 9일
0

.NET

목록 보기
8/31

IEnumerable 열거관련 인터페이스
IEnumerable은 열거관련한 인터페이스이다. 열거가 가능하다는 것은 순회가 가능하다는 것을 뜻한다. 일단 배열은 기본적으로 이 인터페이스를 구현한다. 컬렉션들도 일반적으로 이 인터페이스를 구현한다. (배열 / 리스트 / 해시센 / 큐 / 스택) 은 이를 구현하지만 키-값 형식의 컬렉션에서 순회는 믿고 쓰기가 좀 그런 것 같다.
LINQ를 잘하려면, 사용자정의타입과 ENumerable 메서드를 잘 알아야 한다.
쓸만한 것만 알아보자 빨간 부분으로 표시한 건 나중에 더 자세하게 알아봐야한다는 것이다. 내용이 좀 긴 것들
FirstOrDefault()
Select() / SelectMany()
Reverse()
GroupJoin (== left join / right join 과 비슷)
Join ( Inner Join 과 비슷)
 참고로 Include()는 EF의 메서드이다.
Skip() / SkipWhile()
SkipWhile()은 쓸 일이 많을 것 같다. SkipWhile 안에는 식이 들어간다.
SkipWhile( n => 조건 )
Take() / TakeWhile()
TakeWhile(식)
Distinct() 중복된 항목 제거
ToLookup()
ThenBy() – 중첩 정렬할때 ( OrderBy는 중첩이 불가능하다. 두개 이상 쓰면 항상 마지막 것이 적용된다. )
Zip() 배열들 간 매칭 (남는 것들은 버림)

이것저것
확장메서드를 사용할 때는 한줄에 하나씩 작성하는 것이 좋은 습관이다.
쿼리해석구문과 람다식을 둘 다 쓸 줄 알아야 한다. 사용가능한 확장메서드가 100%일치하지 않는다.
링크 쿼리실행에는 기본적으로 스레드를 1개만 사용한다. 병렬 linq를 사용하면 여러개의 스레드에서 사용가능하다. 하지만 스레드를 2개 이상 돌릴거면 조심해야한다.

람다가 쓰는건 편하지만 모두 다 줄여서 쓰더라도, 용례를 다양하게 알면 좋다.
예를 들어서
int[] fibonacciNumbers = numbers.Select(number => Fibonacci(number)).toArray() 가 있다고 치면 저 람다식을 다음과 같이 익명함수로 전환할 수 있다.
만약에 자바스크립트였으면 저 람다식은
const func = number => Fibonacci(number) 일 것이다.
혹은
const func = number => { return Fibonacci(number) } 일것이다. 혹은
function func(number){
return Fibonacci(number)
} 였을 것이다.
그렇다면 C#에서는 어떻게 나타낼까? 일단 익명함수다.
그리고 C#에서는 형이 정말 중요하다.
때문에 익명함수라도 input, output에 대한 형 명기는 해주어야 한다.
Func<int, int> func = number => Fibonacci(number).toArray() 어때 비슷하지 않나?
만약에 매개변수도 없고 반환형도 없다면
Action func = () => { 문 } 이렇게 하면 된다.
매개변수가 있는데 반환값이 없다면
Action func = number => 문
매개변수가 없는데 반환값이 있는 경우는 일반적으로 사용되지 않지만
Func func = () => 10
반환값이 없으면 Action(작업) 있으면 Function(함수)이다.

var context = new Northwind();

  Product[] products = context.Products.ToArray();

  foreach (var product in products)
  {
      WriteLine(product.ProductName);
  }

  XElement xml = new XElement("root", new XElement("products",
      from product in products
      select new XElement("product",
          new XAttribute("Id", product.ProductId),
          new XAttribute("price", product.Cost),
          new XElement("name", product.ProductName)
          )
      ));

  WriteLine(xml.ToString());

  WriteLine("---- xml 읽기 ---");

  var result = xml.Descendants("products").Descendants("product")
      .Select(x =>x);

  foreach(var element in result)
  {
      WriteLine(element.Element("name").Value);
  } 위의 코드는 linq를 순회해서 xml을 만들어내고 읽는 코드
  1. LINQ의 두가지 필수 구성요소는 무엇인가?
    FROM과 SELECT

  2. 형식에서 속성의 하위 집합을 반환할때 사용하는 LINQ 확장 메서드는 무엇인가?
    TOLOOKUP

  3. 시퀀스를 필터링할때 사용하는 LINQ 확장 메서드는 무엇인가?
    WHERE

  4. 집합을 수행하는 5개의 LINQ 확장 메서드는 무엇인가?
    JOIN / GROUPJOIN / INCLUDE.../

  5. SELECT와 SELECTMANY 확장 메서드 간의 차이점은 무엇인가?
    SELECT는 한개의 데이터에 조건을 걸어서 반환하고
    SELECTMANY는 여러개의 데이터에 한번에 조건을 걸어서 반환한다.

  6. IEnumerable IQueryable 간의 차이점은 무엇이며 어떻게 전환할 수 있는가?
    IEnumerable은 열거가능 인터페이스이고, IQueryable은 쿼리 가능 인터페이스이다. IQueryable을 돌리면 IEnumerable이 결과로서 나온다.

  7. Func<T1, T2, T>와 같은 제네릭 Func 델리게이트에서 마지막 매개변수 T는 무엇을 나타내는가?
    반환형식이다.
    <답안>

  8. LINQ의 두 가지 필수 구성 요소는 FROM과 SELECT입니다. FROM은 데이터 소스를 지정하고, SELECT는 데이터 소스에서 원하는 데이터를 선택합니다.

  9. 형식에서 속성의 하위 집합을 반환할 때 사용하는 LINQ 확장 메서드는 PROJECTION입니다.

  10. 시퀀스를 필터링할 때 사용하는 LINQ 확장 메서드는 WHERE입니다. WHERE는 주어진 조건에 따라 시퀀스에서 요소를 필터링합니다.

  11. 집합 연산을 수행하는 5개의 LINQ 확장 메서드는 JOIN, GROUP JOIN, UNION, EXCEPT, INTERSECT입니다.

  12. SELECT와 SELECTMANY 확장 메서드 간의 차이점은 SELECT는 하나의 데이터에 조건을 걸어서 반환하고, SELECTMANY는 여러 개의 데이터에 한 번에 조건을 걸어서 반환합니다.

  13. IEnumerable와 IQueryable 간의 차이점은 IEnumerable은 데이터 소스를 한 번만 순회하여 데이터를 가져오는 반면, IQueryable은 쿼리를 데이터 소스에 전달하여 데이터를 가져옵니다. IEnumerable를 IQueryable로 전환하려면 EnumerableQuery 클래스를 사용할 수 있습니다.
    IEnumerable customers = GetCustomers(); // IEnumerable 타입의 데이터 소스를 가져옵니다. IQueryable queryableCustomers = customers.AsQueryable(); // AsQueryable() 메서드를 사용하여 IEnumerable를 IQueryable로 변환합니다. // 이제 queryableCustomers는 LINQ 쿼리를 사용하여 필터링, 정렬, 그룹화 등의 작업을 수행할 수 있습니다.

  14. Func<T1, T2, T>와 같은 제네릭 Func 델리게이트에서 마지막 매개변수 T는 반환 형식을 나타냅니다. 이는 함수가 반환하는 값의 형식을 나타냅니다.

0개의 댓글