2010-06-19 3 views
0

LINQ 및 C#에 익숙하지만 한 가지 특정 문제에 문제가 있습니다.2 테이블에서 새 행 만들기

데이터 테이블이 2 개 있습니다.

DataTable 1에는 이름, 집 번호가 있습니다. DataTable 2에는 Street, FirstHouseNumber, LastHouseNumber가 있습니다.

내가하고 싶은 일은 이름, 집 번호, 거리가있는 새 테이블을 만드는 것입니다.하지만 DataTable1이 많은 것으로 끝나고 있습니다. Count * DataTable2 Count 데이터 테이블 1과 동일한 수만 기대할 때 Count.

을 Heres 표현 내가 사용하고 있습니다 : 내가 잘못 뭐하는 거지

var funcquery = from name in DT1.AsEnumerable() 
       from street in DT2.AsEnumerable() 
       where name.Field<int>("Number") >= street.Field<int>("FirstHouseNumber") && name.Field<int>("Number") <= street.Field<int>("LastHouseNumber") 
       select new { Name = name.Field<string>("Name"), Number = name.Field<int>("Number"), street.Field<string>("Street") }; 

? 나는 그것을 전혀 알지 못한다.

TIA.

답변

1

이 좀 더 구체적인 예에 ​​대해 생각하기 쉬울 것입니다 :

Name House Number 
------ ------------ 
Chris 123 
Ben 456 
Joe 789 

Street First House Last House 
     Number  Number 
-------- ------------ ------------ 
Broadway 100   500 
Main  501   1000 

이 데이터를 사용하여 결과를 설명하기 위해 다음 코드를 사용

class HouseInfo 
{ 
    public string Name; 
    public int HouseNumber; 
    public HouseInfo(string Name, int HouseNumber) 
    { 
     this.Name = Name; 
     this.HouseNumber = HouseNumber; 
    } 
} 
class StreetInfo 
{ 
    public string Street; 
    public int FirstHouseNumber; 
    public int LastHouseNumber; 
    public StreetInfo(string Street, int FirstHouseNumber, int LastHouseNumber) 
    { 
     this.Street = Street; 
     this.FirstHouseNumber = FirstHouseNumber; 
     this.LastHouseNumber = LastHouseNumber; 
    } 
} 
static void Main(string[] args) 
{ 
    HouseInfo[] houses = new HouseInfo[] { 
     new HouseInfo("Chris", 123), 
     new HouseInfo("Ben", 456), 
     new HouseInfo("Joe", 789) }; 
    StreetInfo[] streets = new StreetInfo[] { 
     new StreetInfo("Broadway", 100, 500), 
     new StreetInfo("Main", 501, 1000)}; 

    var funcquery = from name in houses 
        from street in streets 
        where name.HouseNumber >= street.FirstHouseNumber && name.HouseNumber <= street.LastHouseNumber 
        select new { Name = name.Name, Number = name.HouseNumber, Street = street.Street }; 
    var results = funcquery.ToArray(); 
    for (int i = 0; i < results.Length; i++) 
    { 
     Console.WriteLine("{0} {1} {2}", results[i].Name, results[i].Number, results[i].Street); 
    } 
} 

결과는 다음과 같습니다

Chris 123 Broadway 
Ben 456 Broadway 
Joe 789 Main 

이것은 내가 생각하는 것 같아서 문제는 코드 y에 있다고 생각하지 않습니다. 오우. 아마도 데이터 자체 (여러 거리에 동일한 집 범위가 포함 된 경우) 또는 다른 것입니다. 문제를 나타내는보다 구체적인 데이터를 제공해야 할 수도 있습니다.

다음은 클래스 대신 DataTables를 사용하여 구현 된 동일한 코드입니다. 동일한 결과를 산출합니다 :

System.Data.DataTable DT1 = new System.Data.DataTable("Houses"); 
System.Data.DataTable DT2 = new System.Data.DataTable("Streets"); 
DT1.Columns.Add("Name", typeof(string)); 
DT1.Columns.Add("Number", typeof(int)); 
DT2.Columns.Add("Street", typeof(string)); 
DT2.Columns.Add("FirstHouseNumber", typeof(int)); 
DT2.Columns.Add("LastHouseNumber", typeof(int)); 
DT1.Rows.Add("Chris", 123); 
DT1.Rows.Add("Ben", 456); 
DT1.Rows.Add("Joe", 789); 
DT2.Rows.Add("Broadway", 100, 500); 
DT2.Rows.Add("Main", 501, 1000); 
var funcquery = from System.Data.DataRow name in DT1.Rows 
       from System.Data.DataRow street in DT2.Rows 
       where (int)name["Number"] >= (int)street["FirstHouseNumber"] 
       && (int)name["Number"] <= (int)street["LastHouseNumber"] 
       select new { Name = name["Name"], Number = name["Number"], Street = street["Street"] }; 
var results = funcquery.ToArray(); 
for (int i = 0; i < results.Length; i++) 
{ 
    Console.WriteLine("{0} {1} {2}", results[i].Name, results[i].Number, results[i].Street); 
}