티스토리 뷰
※ 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" 조건으로 각 필터가 추가되는 결과를 가져옵니다.
'프로그래밍' 카테고리의 다른 글
C#에서 운영체제 인식하기 (0) | 2016.11.10 |
---|---|
LINQ 특정 항목 추출하기 (0) | 2016.11.08 |
LINQ 조인 구문 사용하기 (0) | 2016.10.27 |
비주얼스튜디오로 코드 분석하기 (0) | 2016.10.19 |
LINQ 사용법 - 그룹과 집합 연산 (0) | 2016.10.12 |
- 런타임 에러 76은 경로를 찾을수 없다는 메시지 이군요. 입력하신 경로를⋯
- Set folder = fso.GetFolder(sFolder) 에서 런⋯
- [승인대기]
- 표준 시간은 제주 올레 홈페이지를 참조하시는 것이 좋을듯 하네요. 이 포⋯
- 안녕하세요. 리뷰 감사해요 소요시간이 어떻게 되나요? 저도 가보려고요
- 제주 올레길 / 까미노 데 산티아고 길 을 가봤는데 아직 해파랑 남파⋯
- 아 오르세... 제 가 갔을땐 실내 촬영이 안됬는데 지금은 된다고 하지요⋯
- 법환 포구 빌라 자리엔 원래 각종 맛집들이 있엇는데 말이죠.. 싹 밀어서⋯
- 리눅스의 쉘 환경과 같은 준비를 해주는 것으로 이해하면 좋을듯 합니다. ⋯
- 안녕하세요.. 야라바님 초면에 갑작스럽겠지만 제 생명의 은인입니다. T⋯