티스토리 뷰

프로그래밍

LINQ 필터링 다루기

야라바 2016. 11. 4. 13:20


 ※ LINQ 연관글 모음

 

LINQ에서 필터링은 데이터소스에서 필요한 것을 골라내는 작업으로 where 구문을 통해서 필터링 작업을 수행합니다. where 구문에 기술하는 조건문은 SQL 구문이 아니라 C# 조건문으로 기술합니다. 복합 조건인 경우 SQL의 "AND", "OR", "NOT"이 아니라 C# 구문인 &&, ||, ! 연산자를 사용합니다.

public class Userinfo
{
    public string UserID { get; set; }
    public string UserName { get; set; }
    public string UserType { get; set; }
    public int Age { get; set; }
    public bool Sex { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        List<Userinfo> userinfo = new List<Userinfo>() {
            new Userinfo { UserID = "hong1", UserName = "홍길동", UserType = "vip", Age = 50, Sex = true},
            new Userinfo { UserID = "parkms", UserName = "박문수", UserType = "vip", Age = 54, Sex = true},
            new Userinfo { UserID = "hongsun", UserName = "홍길순", UserType = "vvip", Age = 43, Sex = false},
            new Userinfo { UserID = "kimsg", UserName = "김삿갓", UserType = "general", Age = 35, Sex = true},
            new Userinfo { UserID = "hwang1", UserName = "황금복", UserType = "general", Age = 29, Sex = false},
            new Userinfo { UserID = "hwangso", UserName = "황소", UserType = "vip", Age = 63, Sex = true},
            new Userinfo { UserID = "kimsan", UserName = "김산", UserType = "general", Age = 23, Sex = true},
            new Userinfo { UserID = "seohee", UserName = "서희", UserType = "vvip", Age = 22, Sex = false}};


        Dictionary<string, int> user_fee = new Dictionary<string, int>() { { "vip", 1000 }, { "vvip", 0 }, { "general", 3000 } };

        var qry = from uf in userinfo
                  where uf.Age < 40 && uf.Sex == false
                  select uf;

        int i = 0;
        foreach (var item in qry)
        {
            Console.WriteLine(" {0} : {1} {2} {3} ", ++i, item.UserID, item.UserName, item.UserType);
        }
    }
}

위의 예제에서 보듯이 where 구문 다음에는 C# 조건문 기술 방법으로 필터링을 수행하고 있습니다. 다양한 조건문을 기술할 수 있습니다. 

var qry = from uf in userinfo
          where uf.UserName.StartsWith("홍")
          select uf;

위의 where 구문은 "홍"으로 시작하는 이름으로 필터링한 것으로 SQL 구문으로는 "username LIKE '홍%'"과 같이 기술해야 합니다. 반대로 "홍"으로 끝나는 이름을 추출하려면 SQL 구문은 "username LIKE '%홍'"과 같이 기술해야 하지만 LINQ에서는 where uf.UserName.EndsWith("홍")로 기술하면 됩니다. 물론 .Contains()로 특정 문자열이나 문자를 확인할 수도 있고 정규식을 사용하길 원한다면  System.Text.RegularExpressions.Regex.IsMatch()도 사용할 수 있습니다.

var qry = from uf in user_fee
          join ui in userinfo on uf.Key equals ui.UserType
          where uf.Value > 1000
          select new { uf, ui };

where 구문을 통한 필터링은 조인결과에 대해서도 마찬가지로 적용됩니다. 그렇다면 실행중에 필터링 여부가 결정된다면 어떻게 해야 할까요? 예를 들어 특정 옵션에 따라 어떤 경우에는 나이를 필터링하지 않고 특정한 경우에만 성별 필터링을 하고 싶다는 것입니다.

var qry = from ui in userinfo
          select ui;
if (args.Length > 0)
{
    if (args[0].Contains("v")) qry = qry.Where(r => r.UserType.Equals("vip") || r.UserType.Equals("vvip"));
    if (args[0].Contains("g")) qry = qry.Where(r => r.UserType.Equals("general"));
    if (args[0].Contains("f")) qry = qry.Where(r => r.Sex == false);
    if (args[0].Contains("m")) qry = qry.Where(r => r.Sex == true);
    if (args[0].Contains("y")) qry = qry.Where(r => r.Age < 50);
    if (args[0].Contains("o")) qry = qry.Where(r => r.Age >= 50);
}

위의 예제는 실행중 동적으로 필터링을 수행한 것으로 .Where() 메소드를 활용해서 질의문에 필터를 추가한 것입니다. .Where() 메소드를 반복적으로 호출하면 이전 내용이 지원지는 것이 아니라 "AND" 조건으로 각 필터가 추가되는 결과를 가져옵니다.


댓글
댓글쓰기 폼