쿼리 변수는 항상 foreach문이나 IEnumerator.MoveNext 메서드에 대한 직접 호출에서 반복될 때 요소 시퀀스를 생성하는 Enumerable 형식
int[] scores = { 90, 71, 82, 93, 75, 82 };
IEnumerable<int> scoreQuery = from score in scores
where score > 80
orderby score descending
select score;
foreach(int testScore in scoreQuery)
{
Console.WriteLine(testScore);
}
쿼리 변수 저장 방법 2가지
IEnumerable<City> queryMajorCities = from city in cities
where city.Population > 100000
select city;
IEnumerable<City> queryMajorCities2 = cities.Where(c => c.Population > 100000);
int[] scores = { 90, 71, 82, 93, 75, 82 };
int hightestScore = (from score in scores
select score).Max();
IEnumerable<int> scoreQuery = from score in scores
select score;
int hightScore = scoreQuery.Max();
int hightScore = scores.Max();
List<City> largeCitiesList = (from country in countires
from city in country.Cities
where city.Population > 10000
select city).ToList();
IEnumerable<City> largeCitiesQuery = from country in countries
from city in country.Cities
where city.Population > 10000
select city;
List<CIty> largeCitiesList2 = largeCities.Query.ToList();
쿼리 변수의 명시적 형식 및 암시적 형식
일반적으로 쿼리 변수와 select 절 간의 형식 관계를 표시하기 위해 쿼리 변수의 명시적 형식을 제공
그러나 var 키워드를 사용하여 컴파일 시간에 쿼리 변수(또는 다른 지역 변수)의 형식을 추론하도록 컴파일러에 지시할 수도 있음.
var queryCities = from city in cities
where city.Population > 100000
select city;
쿼리 식 시작
쿼리 식은 from 절로 시작해야함
쿼리 식은 범위 변수와 함께 데이터 소스를 지정한다.
범위 변수는 소스 시퀀스가 트래버스할 때 소스 시퀀스의 각 연속 요소를 나타낸다.
범위 변수는 데이터 소스의 요소 형식을 기반으로 강력하게 형식지 지정된다.
IEnumerable<Country> countryAreQuery = from country in countries
where country.Area > 500000
select country;
쿼리가 세미콜론 또는 continuation 절로 종료될 때까지 범위 변수는 범위 내에 있음
쿼리 식에는 여러 from 절이 포함될 수 있음.
소스 시퀀스의 각 요소가 컬렉션이거나 컬렉션을 포함하는 경우 from 절을 추가로 사용해야합니다.
ex ) Country 개체의 컬렉션이 있으며, 각각에 Cities라는 이름이 City 개체 컬렉션이 포함되어 있다고 가정
각 Country에서 City 개체를 쿼리하려면 다음과 같이 두 개의 from 절을 사용합니다.
IEnumberable<City> cityQuery = from country in coutries
from city in country.Cities
where city.Population > 10000
select city;
쿼리 식 종료
쿼리 식은 group 절 또는 select 절로 끝나야 합니다.
group 절
지정한 키로 구성되는 그룹의 시퀀스를 생성하려면 group 절을 사용
키의 데이터 형식은 무억이든 가능
` 다음 쿼리는 하나 이상의 Country 개체를 포함하며 키가 char 값인 그룹의 시퀀스를 만든다
var queryCountryGroups = from country in countries
group country by country.Name[0];
select 절
다른 모든 시퀀스 형식을 생성하려면 select 절을 사용한다.
간단한 select 절은 데이터 소스에 포함된 개체와 동일한 개체 형식의 시퀀스를 생성
`- 이 예제에서는 데이터 소스에 Country 개체가 포함된다. orderby 절은 단지 요소를 새로운 순서로 정렬하고, select 절은 다시 정렬된 Country 개체의 시퀀스를 생성한다.
IEnumberable<Country> soretedQuery = from country in countries orderby country.Area
orderby country.Area
select country;
Public Sub QueryresulttoTreeListView_Project(tv As TreeListView, dt As DataTable, str As String)
Dim DicTn As Dictionary(Of String, TreeListNode) = New Dictionary(Of String, TreeListNode)
Dim temp As String = Nothing
Dim temp_b As Boolean = False
Dim parentName As String = Nothing
Dim checked_RB As String
For i = 0 To dt.Columns.Count - 1
Dim TempDt As DataTable = dt
For k = 0 To TempDt.Rows.Count - 1
Dim TreeNodeName As String = getchildName(TempDt, k, i) 'row 고정, column값 변경하면서 datatable 값 가져옴
If DicTn.ContainsKey(TreeNodeName) Then
Continue For
Else
DicTn(TreeNodeName) = New TreeListNode(TempDt.Rows(k)(i).ToString())
End If
If i > 0 Then
'parentNode가 있는 경우 자식노드 생성
If temp_b = False Then '부모노드인지 자식노드인지 판별하는 boolen
'temp_b = false면 자식노드, true면 부모노드
parentName = getchildName(TempDt, k, i - 1) 'parentname 가져오는 부분
If String.IsNullOrEmpty(parentName) Then
Continue For
End If
DicTn(parentName).Nodes.Add(DicTn(TreeNodeName)) 'parentnode에 현재 값 add
End If
Else
' 부모/루트 노드 생성
'dictionary(TreeNodeName) null체크 및 TreeNodeName null체크
If Not DicTn(TreeNodeName) Is Nothing And Not String.IsNullOrEmpty(TreeNodeName) Then
If i > 0 Then
temp_b = False
tv.Nodes.Add(DicTn(TreeNodeName)) 'treelistview에 parent/root 노드 생성
'End If
Else
temp_b = False
tv.Nodes.Add(DicTn(TreeNodeName)) 'treelistview에 parent/root 노드 생성
End If
Else
Continue For
End If
End If
Next
Next
nodes = tv.Nodes
'treelistview 노드 생성 완료 후 결함과 검증에 값을 넣어줌
For Each node As TreeListNode In tv.Nodes
Dim defect_dt As Integer = 0
Ldr_ref = dt.Select("[" + str + "] = '" + node.Text + "'")
node.SubItems.Add(Ldr_ref.Count.ToString())
node.SubItems.Add(defect_dt.ToString())
Next
//생략
private void Main_searchTextBox_KeyUp(object sender, KeyEventArgs e) //검색 기능 구현 할 textbox keyup이벤트
{
Thread.Sleep(40);
commonfunction.Main_SearchTextBox(Main_searchTextBox.Text);
}
<CommonFunction.cs>
String MainSearchResult;
#region //Main.cs의 검색기능 메소드
/// <summary>
/// 검색텍스트박스 keypressEvent를 받아와 처리해 주는 메소드
/// </summary>
/// <param name="TextBoxInputValue"> KeypressEvent로 textbox에 입력된 값 </param>
public void Main_SearchTextBox(String TextBoxInputValue)
{
DataTable form1DT_copy = form1.dt; // form1의 datatable form1DT_copy에 복사
MainSearchResult = TextBoxInputValue;
IEnumerable<DataRow> linq_row = null;
DataTable form1DT_re = new DataTable();
form1DT_re = form1DT_copy.Clone();
if (MainSearchResult == "")
{
form1._dgv.DataSource = form1DT_copy;
}
else
{
//MainSearchResult가 ""이 아니면 일치하는 데이터 찾는 코드
foreach (DataRow row in form1DT_copy.Rows)
{
linq_row = from item in row.ItemArray
where item.ToString().ToLower().Equals(MainSearchResult.ToLower())
select row;
//입력된 값이 완전히 일치하는지 확인
foreach (DataRow dt in linq_row)
{
form1DT_re.Rows.Add(dt.ItemArray);
}
//linq 결과를 datatable에 넣어주는 작업
}
//입력된 값이 부분적으로 일치하는 경우
if(form1DT_re.Rows.Count== 0)
{
foreach (DataRow row in form1DT_copy.Rows)
{
linq_row = from item in row.ItemArray
where item.ToString().ToLower().Contains(MainSearchResult.ToLower())
select row;
//입력된 값이 부분적으로 일치하는지 확인
foreach (DataRow dt in linq_row)
{
form1DT_re.Rows.Add(dt.ItemArray);
}
}
}
form1DT_re = form1DT_re.DefaultView.ToTable(true);
form1._dgv.DataSource = form1DT_re;
}
}
#endregion