Right now do !

[C#응용] Linq를 이용한 검색

by 지금당장해

.NET Framework 3.0이 나왔을때 "What's new .net 3.0 ... " 뭐 이런식에 자료들이 나왔을때 그중 생소한 하나가 Linq였다. 이걸 처음에 어떻게 불러야 할지 몰라 링크 그럼 Link와는 어떻게 구별하지 하다 난 그냥 린큐라고 부르기 시작 했다. 지금도 그렇게 부른다. 남들은 뭐라 부르는지 모르겠다. 그냥 나하고 같이 일하는 사람들도 린큐라고 부른다. 암튼 이게 뭐하는 건지 간단히 정의 하고 넘어가자면 IEnumerable 또는 IEnumerable<> 인터페이스를 대상으로 하는 쿼리다. 그러니까 우리가 프로그램 할 때 사용하는 컬렉션 스러운 모든 자료 구조를 대상으로 쿼리를 할 수 있다. 데이터 테이블, XML, List<> 등등 우리가 이게 없을때는 이런 자료들을 뺑뺑이를 돌려서 즉 Looping을 해서 비교 문을 넣어 찾아 구성 했던일을 마치 데이터베이스에 쿼리 하듯이 한다. 다음 이미 다른작업에 의해 구해진 List<>를 대상으로 쿼리를 하여 자료를 필터링 하는 예시이다.프로그램 라인별로 적어놓은 주석을 참고 바란다.  

        
private void FilterByKeyword()
{
    IEnumerable<eptinfo> entities = // 처리 결과가 담길 변수
    from EptInfo eptInfo in _eptInfosForTreeView // SQL의 From절과 C#의 foreach가 합쳐 진듯한  
    where eptInfo.FormName.Contains(txtKeyword.Text) //  조건, C#문법으로 말이 되게 쓰면 된다. SQL문법이 아니다. 예를들어 같다의 경우 == (두개를 써야 한다.)
    select eptInfo; // 왜 쓰는지 진짜 이해 않가는 부분, 근데 않쓰면 올류 난다.

    if (entities.Count<eptinfo>() > 0)
    {
        ComposeTreeView(entities);
    }
    else
    {
        MessageBox.Show(this, "입력된 키워드로 필터링된 서식이 하나도 없습니다."
        , "확인", MessageBoxButtons.OK, MessageBoxIcon.Warning);
    }
}

이 외에도 응용분야가 많다. 혹자는 가독성이 떨어진다고 안쓴다고 하는 분들도 있던데 난 간결해서 자주 사용하는편이다.. 못쓰는 경우는 어떤 이유로 프로젝트가 .net Framework 2.0을 요구할때 인데 요즘의 그런일 없었다. 


아래 코드는 Linq로 select 결과물 중 첫 Row를 구하는 방법이다. (다른 방법도 있는지 모르겠지만) 아래 코드와 같이 FirstOrDefault<T>()라는 메소드를 사용하는 방법이다.  First<T>()를 사용해도 되지만 찾으려는 조건에 해당하는 데이터가 하나도 없는 경우 예외가 발생한다. FirstOrDefault라고 하는 함수 이름에서 Default는 결국 기본 값을 의미하고 참조 타입의 기본값은 null로 보는 것이다.



 
FileEntity existsEntity = (from FileEntity fe in _existsXmlFilesInfo
                                 where fe.TargetPath.Equals(fileEntity.TargetPath)
                                 select fe).FirstOrDefault<fileentity>();

블로그의 정보

지금 당장 해!!!

지금당장해

활동하기