2012-04-30 4 views
5

큰 DataTable이 DataTable의 하위 집합을 DataTable로 표시하려고합니다. DataTable에서 특정 열을 선택하는 방법을 간단히 말합니다.LINQ to DataTable

나는 이런 식으로 뭔가를 시도했지만 작동하지 않습니다 ...

DataTable dTable = new DataTable(); 
... 
... 
... 
     DataTable dt = from field in dTable 
         where field.Field<string>("Manager") 
         where field.Field<string>("Phone") 
         select field; 

어쩌면 내 코드는 내가하지 않고 다른 하나의 DataTable에서 "관리자"와 "전화"열을 얻는 방법, 잘못

루핑은 그것을 생각하니?

+0

무엇에 액세스하고 있습니까? SQL? CLR 개체? – Tormod

+0

아니요, DataTable에 액세스 중입니다 –

+0

현재 코드에서 원하는 것을 이해할 수 있습니까? (두 개의 중첩 된'where'?) –

답변

4

참조하는 DataTableExtensions - 그럼

http://msdn.microsoft.com/en-us/library/system.data.datatableextensions.asenumerable.aspx

...은 MSDN 예에 따라 다음

var whatever = dTable.AsEnumerable(); 

...

var productNames = from products in table.AsEnumerable() 
     select products.Field<string>("ProductName"); 

편집/업데이트 : 불행하게도 내가 할 차이가있는 DataTable에 직접 캐스트 된 빌드가 있다고 생각하지 않습니다. 스키마. 이 있으면 DataTable을 사용할 수 있습니까? 나는 그것을 믿는다 ... 당신의 코드를 리펙토링하고 테스트하는 것은 너무 많은 노력 일 수있다. 행운을 빈다. 강력한 형식의 목록으로 작업 할 때 더 많은 것을 으로 게시하는 것이 좋습니다.

+0

고마워! 하지만 결과적으로 작은 DataTable을 가져야합니다. –

+1

@WildGoat : ['CopyToDataTable'] (http://msdn.microsoft.com/en-us/library/bb396189.aspx)는 당신이 찾고있는 것입니다. 아쉽게도 결과 DataTable은 원본 DataTable과 동일한 스키마 (필드)를 가져야합니다. 그래서 간단히 말해서 불가능합니다. 모든 종류의 익명 형식에서도 작동하는 긴 버전 : http://stackoverflow.com/a/9259348/284240 –

2

당신은 쓸 수 :

var query = from row in dTable.AsEnumerable() 
     select new 
     { 
     manager = row.Field<string>("Manager"), 
     phone = row.Field<string>("Phone")       
     }; 
1

당신은 AsEnumerable의 도움으로 데이터 집합에 DataTable을 또는 특정 테이블에 LINQ 쿼리를 실행할 수 있습니다.

예를 들어 도움이 될 것입니다.

DataSet ds = new DataSet(); 
    DataTable dt = new DataTable(); 
    DataColumn dc; 
    DataRow dr; 
    ds.DataSetName = "products"; 
    dt.TableName = "product"; 

    dc = new DataColumn("product_id",long.MaxValue.GetType()); 
    dt.Columns.Add(dc); 

    dc = new DataColumn("product_name"); 
    dt.Columns.Add(dc); 

    dr = dt.NewRow(); 
    dr["product_id"] = 1; 
    dr["product_name"] = "Monitor"; 
    dt.Rows.Add(dr); 

    dr = dt.NewRow(); 
    dr["product_id"] = 2; 
    dr["product_name"] = "Mouse"; 
    dt.Rows.Add(dr); 

    dr = dt.NewRow(); 
    dr["product_id"] = 3; 
    dr["product_name"] = "KeyBoard"; 
    dt.Rows.Add(dr); 

    dr = dt.NewRow(); 
    dr["product_id"] = 4; 
    dr["product_name"] = "LCD"; 
    dt.Rows.Add(dr); 

    ds.Tables.Add(dt); 

    IEnumerable<DataRow> objResult1 = from tbl in dt.AsEnumerable() 
            where tbl.Field<long>(0) <= 2 
            select tbl; 

    Response.Write("<b>Query Results 1</b>"); 
    foreach (DataRow row in objResult1) 
    { 
     Response.Write(string.Format("<br/>Product ID: {0} , Product Name: {1}", row.Field<long>(0), row.Field<string>(1))); 
    } 

    IEnumerable<DataRow> objResult2 = from tbl in ds.Tables[0].AsEnumerable() 
            let product_name = tbl.Field<string>(1) 
            where product_name.StartsWith("Key") 
            || product_name.StartsWith("Mo") 
            select tbl; 

    Response.Write("<br/><br/><b>Query Results 2</b>"); 
    foreach (DataRow row in objResult2) 
    { 
     Response.Write(string.Format("<br/>Product ID: {0} , Product Name: {1}", row.Field<long>(0), row.Field<string>(1))); 
    }