1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#import <Foundation/Foundation.h>
 
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //convenience method
//        NSString *str = [[NSString alloc]initWithString:@"This is NSString"];
        NSString *str = @"This is NsString";
        
        NSLog(@"str :%@",str);
        
        //immutable class
        NSString *result;
        // 8번 index 부터 시작
        result = [str substringFromIndex:8];
        NSLog (@"result :%@",result);
        // 0번 index 에서  11번까지
        result = [str substringToIndex:11];
        NSLog (@"result :%@",result);
        
        // 0번부터 11번까지 자른후 8번인덱스 부터 다시 자른다
        result = [[str substringToIndex:11]substringFromIndex:8];
        NSLog (@"result :%@",result);
 
        // 8번 index 에서 11번인덱스까지 자른후 lowercase
        result = [[str substringWithRange:NSMakeRange(8,3)] lowercaseString];
        NSLog (@"result :%@",result);
    }
    return 0;
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 

 

공부하면서 자주쓰는 메서드들을 정리하고있습니다


WRITTEN BY
내가달이다

,


평소에 작업을 복사 붙여넣기만 하다보니 그 구문을 왜쓰는지 모르고 그냥 작성하다보니 


안좋은 습관만점점늘어가는거같아서


"왜? 이걸썻을까 무슨생각으로 썻을까" 라는 마인드를 가지고 이제는 그 코드에 개발자가 무슨생각으로 코딩을했을까


생각을 하고 나름대로 정리를 해보려고한다 


IQueryable  과 IEnumerable 의 차이에 대해 알아보려고 한다 


IEnumerable


LINQ-to-Object 이 작동하도록 하는 인터페이스이다. 원래 쿼리와 일치하는 모든개체가


데이터 베이스 메모리에 온로드된다 


 

1
2
3
4
5
6
//EF , dbset
 
public IEnumerable<master> getListCode(string code)
{
    return _dbset.Where(p => p.CODE = code);
}
cs



이구문을 실행하게 되면  master 테이블을 통으로 조회를 한후 서버단에서 처리를한다 


ex) select * from master 


그후 서버에서 where 필터링을 해준다


동작방식은 밑에그림 참조




IQueryable  



LINQ-to-SQL 이 작동하도록 하는 인터페이스이다. WHERE 조건을 걸린 쿼리가 데이터베이스에서 실행이되고


데이터베이스메모리에 code 필터링 값을 로드시켜준다


1
2
3
4
5
6
//EF , dbset
 
public IQueryable<master> getListCode(string code)
{
    return _dbset.Where(p => p.CODE = code);
}
cs



ex) select * from master where code = 2





둘의차이점은 IQueryable<T> 을 사용하면 많은 데이터를 로드할필요없이 원하는 필터링만 조회를할수있다 

예로 페이징처리를 할수있다 Take 밑 Skip 을 이용해 요청한 행만 확보할수있다

IEnumerable 을 사용하면 모든행이 메모리에 로드가된다.


간단히 요약을 하자면 


IEnumerable 은 메모리에 로드한후 필터링을 하는것이도

IQueryable 은 필터링을 거친후 필요한 데이터만 가져온다





출처 : https://www.facebook.com/DotNetInterviewQuestions/videos/751393584901587 

, https://www.codeproject.com/Articles/766541/IEnumerable-vs-IQueryable


'ASP.NET MVC' 카테고리의 다른 글

ASP.NET MVC :: JSON 데이터형식을 커스텀모델에 담기  (0) 2018.08.04

WRITTEN BY
내가달이다

,


유지보수를 하다보니 JSON 을 이용하는 경우가 많은데 현직장에서는 받아온 JSON 데이터를 


DB에 저장을한후 특정 조건이 만족될떄 저장된 JSON 데이터를 커스텀 모델에 바인딩을 한후 


프론트 페이지에 뿌려주는 경우가 종종있었다 


나중을 위해 포스팅을 해보려고 한다



// DummyModel
public class DummyModel
    {
public string NAME { get; set; }
        public string NICKNAME { get; set; }
public string ADDR { get; set; }
    }

[HttpPost]
[ValidateInput(false)]
public ActionResult DummyCreate(DummyModel dummy)
{
DUMMY_INFO_JSON = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(dummy); //.NET 객체를 JSON 포맷의 문자열로 만들기 위해서는 JavaScriptSerializer 의 Serialize() 메소드를 사용한다.
// 새로운 모델을 생성한다
NewModel model = new NewModel();
// 선작업으로 DB 에 저장되었다는 가정을 한다 그후 가져온데이터를 같은형식의 모델에 Deseralize() 해준다
model.UserMaster = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<USER_MASTER>(DUMMY_INFO_JSON);
}



'ASP.NET MVC' 카테고리의 다른 글

IQueryable vs IEnumerable 차이점  (0) 2019.02.03

WRITTEN BY
내가달이다

,


사내 관리자 페이지에서 자료를 보여줄떄 주로 JQgrid 를 이용하고있습니다 최근 클라이언트의 요구사항이 있었는데 


다중 선택을해서 일괄로 해당회원들을 승인을 해주고 싶다고 했다


크게 어려운문제가 아니고 기존 프로세스나 로직이 있으니 그걸 이용해서 만들게 됬다 


우선 해야될일은 그리드에 다중셀렉 기능을 추가를해주었다 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
jQuery("#GridMaster").jqGrid({
        url: ''       
datatype: 'json',
        mtype: 'POST',
        height: 500,
        rowNum: 0,
        hidegrid: false,
        rowList: [102030],
        multiselect: false,
        altRows: true,
        altclass: 'EvenRowClass',
        colNames: [1234,],
        colModel: [
        { name'SEQ_NO', index: 'SEQ_NO', width: 80, sortable: false, align: 'center' },
        { name'NAME', index: 'NAME', width: 70, sortable: false, align: 'center' },
        { name'ORDER_CD', index: 'ORDER_CD', width: 1, sortable: false, align: 'center', hidden : true },
        { name'ORDER_SEQ', index: 'ORDER_SEQ', width: 1, sortable: false, align: 'center', hidden: true }
        ],
        viewrecords: true,
        multiselect: true
    });
cs



multi select : true // 다중셀을 선택할수있도록 해주는 옵션입니다


1
2
3
4
5
6
7
8
9
10
11
.navButtonAdd('#pageer1',{
  caption:"Confirm",
  title:"Confirm",
  id : "Confirm"
  buttonicon:"ui-icon-save",
  onClickButton: function(){
     SaveConfirm();
  },
  position:"last"
  })
 
cs


하단바에 Confirm 이라는 버튼을 생성해준후 버튼 클릭스 SaveConfirm()을 실행시켜준다



1
$("#GridMaster").getGridParam('selarrrow'); 
cs


그리드에서 체크된 row의 id값을 가져온다 .. 


그후 for 문을 이용해 선택된 row id 값만큼 돌려준후 AJAX 비동기 통신을 해준다.


1
2
3
4
5
6
7
8
9
10
11
12
13
var JsonArray = new Array(); 
var Json = new Object();
 
Json.Name = "name";
Json.Count = 2 ;
 
JsonArray.push(Json);
 
Json.Name = "name_2";
Json.Count = 3 ;
 
JsonArray.push(Json);
 
cs

JsonArray 배열을 생성시켜준후 Object 에 값을 입력후 JSON으로 Controller 로 데이터를 보내줄생각이다 ( 위의 데이터는 예제)


JSON.stringify(Json); // JSON 형태로 데이터를 보내준다



1
2
3
4
5
6
7
8
9
10
11
12
13
public class temp_data
{
    public string Name {get;set;}
    public int Count {get;set;}
}
 
public ActionResult temp (List<temp_data> temp)
{
    foreach(var item in temp)
    {
        // save Logic
    }
cs


Controller 에서 데이터를 받아줄때 List 형식으로 받아주었다 


Ajax 를 통해 전송된 데이터형식과 똑같은 클래스를 만들어 주고 List<> 형식으로 데이터를 받아준후 foreach 문을 돌려


save Logic 을 실행시켜준다 

'ASP.NET MVC > jquery' 카테고리의 다른 글

Jquery :: 1 .empty() 텍스트 비우기  (0) 2018.05.06

WRITTEN BY
내가달이다

,


웹쪽을 이제 막 배우는 입장이다 보니 JQUERY 를 사용하다가 이해가 안되거나 한번더 다시 볼 필요가  있는 경우 에 포스팅을 해보려 합니다



회사에서 운영중인 모바일 페이지중 댓글을 infinite scroll 하는 작업이 추가가 되어서 partialview 를 이용해 infinite scroll 을 해주는 작업을 


구글신의 도움을 통해 구현을 다해서 테스트를 하는중 뜻하지 않는 버그(?) 가 발생했다


처음 로드시 스크롤을 통한 댓글들이 정상으로 보였는데  댓글을 추가할시 추가한댓글을 리스트에 다시 바인딩 될때 기존 바인딩되었던


데이터에 추가가 되어서 나오게된것이었다 즉,


1 ~ 10 번째 댓글 

11 ~ 20 번째 댓글

21 ~ 30 번째 댓글


이상태에서 댓글을 추가를 하면 


1 ~ 10 번째 댓글

11 ~ 20 번째 댓글

21 ~30 번째 댓글

1 ~ 10 번째 댓글

11 ~ 20 번째 댓글

21 ~30 번째 댓글

31 ~ 번쨰 댓글  

이런식으로 데이터가 출력이 되는걸 확인이 되었다 

그래서 이전에 있던 데이터를 어떻게 지우고 다시 바인딩데이터를 뿌리나 한참을 찾다가 찾아낸사실..

기존에 데이터를 바인딩을 할때는 

1
("#CommentList").append(htmlString);
cs


기존 데이터에 htmlString 을 append 시켜주는 식으로 추가를 해주었다 댓글이 추가 되거나 삭제 되었을때의 상황을 생각을 못하고


무작정 스택오버플로우의 코드를 복사를 하니 이런일이...


1
("#CommentList").empty().append(htmlString);
cs


그래서 찾아낸 방법이 jqery 메서드중에 .empty() 라는 메서드가 있는데


DOM 에 조건이 일치하는 요소들의 자식들을 제거를 한다 


기존 <div id= "CommentList">  에 바인딩 되어있는 데이터를 제거를 한후 다시 htmlString 을 바인딩 시키는 작업을 한다 



WRITTEN BY
내가달이다

,

안녕하세요 .. 요새 직장에 다시 들어가서 정신없이 배우느라 포스팅할 시간이없어서 주말동안에 회사에서 배운것을 정리할겸 포스팅을 할계획입니다  (_ _) 



회사업무 특성상 집계, 카운팅을 자주 하게되는데 오늘 배운 쿼리를 공부 할겸 다시보기 해보려고한다


클라이언트의 요구사항은 이것이었다 


일반회원중 등급 1, 등급 2의 거주지역을 시도별로 집계 해달라는것이었다



1. 우선 일반회원중 등급이 1,2 인 사람들의 총합을 구해보도록 하려한다


1
2
3
4
5
/* 총회원(등급 1,2) */   
SELECT COUNT(*)   
FROM USER_MASTER UM (NOLOCK)                                        -- 유저 마스터 테이블 ( 개인회원 , 기업회원 )
JOIN USER_PERSONAL UP (NOLOCK) ON UP.[USER_ID] = UM.[USER_ID]       
WHERE UM.USER_FG IN ('1''2')                                         -- 개인회원중 등급이 1,2인 회원
cs


총회원을 구한후 평소와 같이 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* 정상우편번호 회원(등급 1,2) */   
SELECT T.COUNTY, COUNT(T.[USER_ID]) AS CNT                            -- 시도 (서울,경기,부산) , 시도별 유저수 카운팅
  INTO #ADDRESS1   
FROM (   
   SELECT Z.COUNTY, UM.[USER_ID]                                      -- 시도 (서울,경기,부산) , 시도별 유저수 그후  시도,사도별유저수로 묶기위해 group by
   FROM USER_MASTER UM (NOLOCK)
   JOIN USER_PERSONAL UP (NOLOCK) ON UP.[USER_ID] = UM.[USER_ID]
   LEFT JOIN ZIPCODE Z (NOLOCK) ON Z.ZIP_CD = REPLACE(UM.ZIP_CD, '-''')  -- 우편번호 테이블을 가져온다 유저마스터의 zip 조건으로
   WHERE UM.USER_FG IN ('1''2'
     AND Z.COUNTY IS NOT NULL
   GROUP BY Z.COUNTY, UM.[USER_ID]
) AS T   
GROUP BY T.COUNTY   
ORDER BY 1   
cs


우편번호 테이블의 기본주소  유저 마스터 기본주소 를  키값으로 LEFT 조인 시켜준다


그후 시도, 시도별 유저수를 select 시켜준다 


하지만....


총회원값 과 가져온 회원수가 일치하지 않는 것이었다 ..


아무래도 회원가입을 할때 Validate 가 제대로 되지않은거 같다... 몇가지 샘플을 찾아보니 맨앞에 공백이 들어가있는 컬럼도 몇개있었다..


그래서 생각한것이 주소지 앞에 2자리만 추출을 하는것이었다 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* 주소지 텍스트로 시도추출로 추출() */                          
SELECT T.COUNTY, COUNT(T.[USER_ID]) AS CNT   
  INTO #ADDRESS2   
FROM (   
   SELECT Z1.COUNTY, UM.[USER_ID]
   FROM USER_MASTER UM (NOLOCK)
   JOIN USER_PERSONAL UP (NOLOCK) ON UP.[USER_ID] = UM.[USER_ID]
   LEFT JOIN SYS_ZIPCODE Z (NOLOCK) ON Z.ZIP_CD = REPLACE(UM.ZIP, '-''')
   LEFT JOIN (SELECT SIDO FROM SYS_ZIPCODE (NOLOCK) GROUP BY SIDO) Z1 ON Z1.SIDO = LEFT(LTRIM(UM.ADDR1), 2--앞에 2자리 (서울,경기) 만 추출
   WHERE UM.USER_FG IN ('1''2'
     AND Z.ZIP_CD IS NULL
     AND Z1.COUNTY IS NOT NULL
   GROUP BY Z1.COUNTY, UM.[USER_ID]
) AS T   
GROUP BY T.COUNTY   
ORDER BY 1 
cs


이렇게 추출한 2개의 쿼리문을 임시테이블에 INSERT 시킨후 


1
2
3
4
5
6
7
8
/* 정상우편번호 + 주소지 텍스트 추출 회원*/   
SELECT T.SIDO, SUM(CNT) AS CNT   
FROM (   
   SELECT SIDO, CNT FROM #ADDRESS1
   UNION ALL
   SELECT SIDO, CNT FROM #ADDRESS2
) AS T   
GROUP BY T.SIDO   
cs


정상우편번호 + 주소지 에서 앞에 2자리만 추출한 테이블을 UNION ALL 시킨후 총합을 계산해


총회원과 비교를 해본후 정상을 확인해볼수 있다 ..

'ASP.NET MVC > SQL' 카테고리의 다른 글

MSSQL :: 1 Join  (0) 2017.01.13
MSSQL :: 0 CURSOR  (0) 2016.12.01

WRITTEN BY
내가달이다

,