2013-06-23 4 views
0

DataSet.CopyToDataTable에 LINQ에서 '새로운 선택'작동하지 않습니다 http://msdn.microsoft.com/en-us/library/bb386921.aspx다음 링크에서()

단락 "사용자 정의 CopyToDataTable 방법 만들기">

나는 비슷한 뭔가를 시도했다.

ObjDA = new OleDbDataAdapter(querySQL, conection); 

//Create a DataSet object: 
ObjDS = new DataSet(); 

ObjDA.Fill(ObjDS, "Table1"); 

DataTable MyTable = ObjDS.Tables["Table1"]; 

//IEnumerable<DataRow> query = 
var query = 
    from user in MyTable.AsEnumerable() 
    where user.Field<string>("Name").StartsWith("c", true, null) 
    select new 
    { 
     Name = user.Field<string>("Name") 
    }; 

DataTable orderTable = query.CopyToDataTable(); 

문제는 "query.CopyToDataTable"에 있습니다 :에 "System.Data.DataRow"암시 적 참조 변환 "AnonymoustType # 1"이되지 않습니다 내 코드입니다. "select user"라고 쓰면 문제없이 작동합니다 : 새로운 것을 선택하십시오.

내가 작성하는 경우 :

query = (...) as IEnumerable<DataRow> 

쿼리는 항상 null를 돌려줍니다.

나는 무엇을 해야할지 잘 모릅니다.

답변

0

실제로이 기사에서 설명하는 절차를 수행 했습니까? 기사에서 설명하는대로 CopyToDataTable은 기본적으로 IEnumerable<DataRow>에서만 작동합니다. 사용자 지정 형식에서 메서드를 사용하려는 경우 Implement CopyToDataTable Where the Generic Type T Is Not a DataRow

이 섹션의 모든 예제는 사용자가 프로세스를 수행하고 사용자 지정 CopyToDataTable<T> 메서드를 먼저 만든 것으로 가정합니다.

+0

your link : "그러나 CopyToDataTable 메서드는 generic 매개 변수 T가 DataRow 유형 인 IEnumerable 소스에서만 작동합니다." MyTable.AsEnumerable에서 사용자로부터이하지 못했습니다? '는 IEnumerable 쿼리 = 는()이다 user.Field ("이름"). StartsWith ("C", NULL, 사실은) 새로운 { 이름을 선택 = user.Field ("이름") }; ' –

+0

매우 감사합니다. –

+0

@karmany 첫 번째 주석의 코드가 작동하지 않는 이유는 새로 작성한 객체가 * DataRow가 아니기 때문입니다.임의의 타입을 가져 와서 "'DataRow as"라고 말할 수는 없습니다. DataRow로부터 파생시켜야합니다. 임의의 익명 유형은 유효하지 않습니다. –

0

query 코드 예는 CopyToDataTable이어야합니다. 당신이 정말로 CopyToDataTable 방법을 즐기고 싶은 경우

select new 
       { 
        Name = user.Field<string>("Name") 
       }; 

, 당신은 원래의 코드 예제에 충실해야합니다 :

DataTable orders = ds.Tables["SalesOrderHeader"]; 

IEnumerable<DataRow> query = 
    from order in orders.AsEnumerable() 
    where order.Field<DateTime>("OrderDate") > new DateTime(2001, 8, 1) 
    select order; 

DataTable boundTable = query.CopyToDataTable<DataRow>(); 
query은 T는 하나 개의 속성 ( Name)과 익명 형식으로 일어나는는 IEnumerable입니다

원하는 내용을 지원하려면 사용자 지정 CopyToDataTable 메서드를 만들어야합니다. http://msdn.microsoft.com/en-us/library/bb669096.aspx

+0

'query'는 익명 형식이 아닙니다. 그것은'IEnumerable '이며, 여기서'T'는 익명으로 발생합니다.하지만 여전히'CopyToDataTable' 확장 메소드를 호출 할 수 있습니다. 문제는 당신이 직접 구현하지 않는 한 그 메소드의 일치하는 오버로드가 없다는 것입니다. –

+0

감사합니다. "select order"는 잘 작동하지만 "select new"는 작동하지 않습니다. 원래 예제 코드 (세 번째 코드)는 "select new"를 사용합니다. "새로운 선택"을 사용할 수 없습니까? –

+0

@MichaelEdenfield 고맙습니다. 답을 수정하겠습니다. –

관련 문제