개인적으로 자주 쓰는 linq 샘플
자주 사용하는 내용을 위주로 정리해 보았습니다. 상시 갱신 예정.
Model
Sample Model
// List<TestModel> testList = new List<TestModel>();
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<TestSubModel> testSubList = new List<TestSubModel>();
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<TestSubModel> 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();
서브쿼리 이용
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를 서브쿼리로서 사용하는건 불가능합니다.
[NotSupportedException]
Unable to create a constant value of type 'XXXXX'. Only primitive types or enumeration types are supported in this context.
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();