Linq를 사용하면 sql 쿼리를 몰라도 EF에 대한 이해도가 있다면
쉽고 빠르게 작성 할 수 있다.
- SELECT * FROM User
1개, 리스트
var selectList = db.Users;
1. DbSet<User> selectList = db.Users;
2. List<User> selectList = db.Users.ToList().Where().OrderBy();
3. IEnumerable<User> selectList = db.Users.AsEnumerable();
4. IQueryable<User> selectList = from user in db.Users select user; // Linq to Sql -> Stackoverflow에서 사용한다.
Extension Query => 작성이 가능
1. IEnumerable => 쿼리 => 데이터(10명) => Client => 느리다.
2. IQueryable => 쿼리 =>데이터(10명) => Server => 빠르다.
동작 방식이 달라서 때에 따라서 잘 쓰면 성능향상에 도움이 된다.
IEnumerable 시퀀스로 변경하기 때문에 데이터베이스가 아니라 로컬 컴퓨터에서 더 많은 작업을 수행하고 LINQ to Objects 구현체와 델리게이트를 이용해서 수행된다.
IQueryable<T>는 LINQ-to-SQL이 작동 할 수 있도록 하는 인터페이스
LINQ to SQL 라이브러리가 모든 쿼리문을 결합하여 단번에 SQL 결과를 생성한다.
- INSERT INTO User(UserId, UserName) Values(1, “홍길동”)
db.Users.Add(User);
db.SaveChanges();
db.Users.Add(new User
{
UserId =3,
UserName = "홍길동",
Birth = "801010"
});
db.SaveChanges(); // commit(이 부분을 실행해야 DB에 반영이된다.)
- 기존 정보를 수정
- UPDATE User SET UserName=’홍길동’ WHERE UserId = 1
// 되도록 분리 합치면 코드가 너무 길어진다.
>ar user = new User { UserId = 1, UserName = "장길동" };
db.Entry(user).State = EntityState.Modified;
db.SaveChanges();*/
- DELETE FROM User WHERE UserId =1
var user = new User{UserId = 2};
db.Users.Remove(user);
db.SaveChanges();
- 변수의 자료형을 자동으로 저장하는 것
- var "변수명" = "초기화 해줄 값"
- 지역 변수로 선언하지 않으면 "형식 또는 네임스페이스 이름을 찾을 수 없다고" 오류가 뜸
- 선언과 동시에 초기화 해야함
var list = db.Users.ToList(); // 전체출력
var list = db.Users.Where(u => u.UserName == "뚱이"); // 특정 값
.First(), .FirstOrdDefault(), SIngle(), .SIngleOrDefault() 등 이 있다.
var user = db.Users.First(); // SELECT TOP 1 * FROM Users
// ()안에 람다식을 넣어서 딱 1개를 조회 할 수 있다.
var user = db.Users.First(u => u.UserId == 1); // SELECT TOP 1 * FROM Users WHERE UserNAme = "임길동"
- Single() : 데이터가 0이거나 1개 초과 면 오류가 발생한다. ( 1만 가능)
- SingleOrDefault() : 1개 초과 이면 오류가 발생한다. (0 또는 1)
- First() : 결과값이 안나오면 오류가 뜬다.
- FirstOrDefault() : 결과값이 null 일때만 오류가 발생한다.
실무에서는 SingleOrDefulat()를 사용하면 Exception 발생할 가능성이 있기 때문에 FirstOrDefault를 많이 쓴다. FD는 두개 이상이어도 하나만 가져오기 때문에 더 사용한다. 물론 여러 결과가 나올 때 나는 두번째 결과 값을 원하는데 첫번째 결과값을 반환 해줄 수 있다. 그 값이 내가 원하는 값이 맞나에 대한 문제점이 있긴하다.
OrderBy() : 1, 2, 3, 4, 5 오름차순
DecendingBy() : 5, 4, 3, 2, 1 내림차순
// 이름을 기준으로 오름차순
var list = db.Users.OrderBy(u=> u.UserName).ToList();
특정 테이블 특정 칼럼 데이터만 필요로 하는데 Include()를 사용하면 데이터를 전부 불러오기 때문에 대용량 데이터일 경우는 성능상 문제점이 있다 그래서 성능 향상을 위해 Linq에서 쿼리 구문을 권장한다. 간단하게 할 때는 Include로 사용해도 큰 부담 없이 무방하다~