자주 사용하는 내용을 위주로 정리해 보았습니다. 상시 갱신 예정.
1. LINQ로 간단히 데이터를 추출할 경우
Model
Sample Model
// List testList = new List();
public class TestModel
{
public int Id { get; set; }
public string Name { get; set; }
public int Quantity { get; set; }
public decimal Price { get; set; }
public string Remarks { get; set; }
}
// List testSubList = new List();
public class TestSubModel
{
public int Id { get; set; }
public string Name { get; set; }
public int Total { get; set; }
}
ForEach
testList.ForEach(x => x.Remarks = x.Remarks + "추가내용" );
testList.ForEach(x => { if (x.Id == 1) { x.Name = "내용"; x.Remarks = "내용"; } });
OrderBy
testList.OrderByDescending(x => x.IsMainPackage).ThenBy(x => x.PackageId).ToList();
GroupBy
List testSubList = testList.GroupBy(x => x.Id).Select(m => new TestSubModel
{
Id = m.First().Id,
Name = m.First().Name,
Total = m.Sum(x => x.Price * x.Quantity)
}).ToList();
like검색
var list = new string[]{"one", "two", "three"};
if(list.Contains("one"))
{
// list에 있는 것
}
if(!list.Contains("four"))
{
// list에 없는 것
}
복수 GroupBy
var list = from x in testList
where x.Id == 13
group x by new { x.Name, x.Quantity } into g
select new
{
g.Key.Name,
g.Key.Quantity,
g.Key.Price
};
Join
var list = (from ft in db.first_table
join st in db.second_table on ft.Id equals st.Id
join tt in db.third_table on ft.DetailId equals tt.DetailId into temp
from tt in temp.DefaultIfEmpty() // LEFT OUTER JOIN
where ft.Id == 13
select new Detail
{
DetailId = ft.DetailId,
Account = st.Account,
CustomerTel = tt.CustomerTel
}).OrderByDescending(x=>x.DetailId).ThenBy(x=>x.Account).ToList();
복수 조건으로 Join
var list = (from ft in db.first_table
join st in db.second_table on new { Id = ft.Id, Account = "Account" } equals new { Id = st.Id, Account = st.Account } // join by multiple values
where ft.Id == 13
select new Detail
{
DetailId = ft.DetailId,
Account = st.Account,
CustomerTel = tt.CustomerTel
}).OrderByDescending(x=>x.DetailId).ThenBy(x=>x.Account).ToList();
2. 서브쿼리를 이용할 경우
Entity Framework에서 제일 최근에 갱신된 레코드를 추출하기
1. tb1에서 같은 DetailId를 가진 복수의 레코드 중에서 제일 최근에 갱신된 레코드를 추출
var list = (from t in db.tb1
group t by t.DetailId into g
select g.OrderByDescending(e => e.LastUpdatedAt).FirstOrDefault() into p
select new
{
Id = p.Id,
DetailId = p.DetailId,
LastUpdatedAt = p.LastUpdatedAt
}).ToList();
2. tb1에서 같은 DetailId를 가진 복수의 레코드 중에서 제일 최근에 갱신된 스테이터스가 10인 레코드의 값과 그 레코드와 조인된 tb2.Name의 값을 추출
var list = (from t in db.tb1
group t by t.OrderDetailId into g
select g.OrderByDescending(e => e.LastUpdatedAt).FirstOrDefault() into p
join tt in db.tb2 on p.DetailId equals tt.DetailId
where
p.Status == 10
select new
{
Id = p.Id,
DetailId = p.DetailId,
Name = tt.Name,
LastUpdatedAt = p.LastUpdatedAt
}).ToList();
3. 개별 IQueryable 쿼리를 join해서 서브쿼리로서 사용
var userQuery = db.user.Where(x => x.delete_flg == false);
var items = (from t in db.item
join uq in userQuery on t.user_id equals uq.user_id
where t.category == 1
select t).ToList();
※SQL문으로 작성된 IQueryable를 서브쿼리로서 사용하는건 불가능합니다.
SQL문으로 작성된 IQueryable를 서브쿼리로 설정할 경우의 에러 예시
[NotSupportedException]
Unable to create a constant value of type 'XXXXX'. Only primitive types or enumeration types are supported in this context.
Entity Framework에서 SQL문을 직접 실행해서 결과 취득하기
3. 그외
List<string> 에서 List<int>
var list1 = new List<string>();
list1.Add("1");
list1.Add("2");
list1.Add("3");
list1.Add("4");
List<int> list2 = new List<int>();
list2 = list1.Select(Int32.Parse).ToList();
List<int> 에서 List<string>
var list1 = new List<int>();
list1.Add(1);
list1.Add(2);
list1.Add(3);
list1.Add(4);
List<string> list2 = new List<string>();
list2 = list1.Select(x=> x.ToString()).ToList();
object[] 에서 List<string>
var obj = new object[] { "first", "second" };
var list = new List<object>(obj).Select(x => x.ToString()).ToList();
원글 작성일 2017-02-02
'개발 > ASP.NET' 카테고리의 다른 글
ASP.NET MVC : 화면상에서 파일 업로드 하기 (0) | 2019.01.23 |
---|---|
ASP.NET MVC : CSV 파일을 작성해서 다운로드 하기 (0) | 2019.01.23 |
CSV 파일 출력시에 마지막 행에 NULL 문자열이 삽입되는 문제(byte[] 변환 문제) (0) | 2019.01.23 |
CSV 파일 작성 (0) | 2019.01.23 |
ASP.NET http접속을 https로 리다이렉트 시키기 (0) | 2019.01.23 |
댓글