개인적으로 자주 쓰는 linq 샘플

개인적으로 자주 쓰는 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.

Entity Framework:SQL문을 직접 실행


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();

Pie's Tech Note

생계형 개발자의 메모장

comments powered by Disqus

    rss facebook twitter github youtube mail spotify instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora