[C#] DataTable에 대한 LINQ 쿼리

DataTable 개체에서 LINQ 쿼리를 수행하려고하는데 기이하게 DataTables에서 이러한 쿼리를 수행하는 것이 간단하지 않다는 것을 알게되었습니다. 예를 들면 다음과 같습니다.

var results = from myRow in myDataTable
where results.Field("RowNo") == 1
select results;

이것은 허용되지 않습니다. 이처럼 작동하는 것을 어떻게 얻습니까?

LINQ 쿼리가 DataTables에 허용되지 않는다는 것에 놀랐습니다!



답변

DataTable 컬렉션 에 대해 쿼리 할 수 ​​없습니다 . DataRowCollection구현하지 않기 때문 IEnumerable<T>입니다. 의 AsEnumerable()확장명 을 사용해야합니다 DataTable. 이렇게 :

var results = from myRow in myDataTable.AsEnumerable()
where myRow.Field<int>("RowNo") == 1
select myRow;

로 그리고 @Keith는 말한다, 당신에 대한 참조를 추가해야합니다 System.Data.DataSetExtensions을

AsEnumerable()을 반환합니다 IEnumerable<DataRow>. 당신이 변환해야하는 경우 IEnumerable<DataRow>A를 DataTable, 사용 CopyToDataTable()연장.

다음은 Lambda Expression을 사용한 쿼리입니다.

var result = myDataTable
    .AsEnumerable()
    .Where(myRow => myRow.Field<int>("RowNo") == 1);


답변

var results = from DataRow myRow in myDataTable.Rows
    where (int)myRow["RowNo"] == 1
    select myRow


답변

DataTable에서 의도적으로 허용되지 않았을뿐만 아니라, Linq 쿼리를 수행 할 수있는 IQueryable 및 일반 IEnumerable 구문보다 DataTables가 최신 버전 일뿐입니다.

두 인터페이스 모두 일종의 형식 안전 유효성 검사가 필요합니다. DataTable은 강력하게 형식화되지 않았습니다. 예를 들어 사람들이 ArrayList에 대해 쿼리 할 수없는 것과 같은 이유입니다.

Linq가 작동하려면 결과를 형식이 안전한 개체에 매핑하고 대신 쿼리해야합니다.


답변

@ ch00k가 말했듯이 :

using System.Data; //needed for the extension methods to work

...

var results =
    from myRow in myDataTable.Rows
    where myRow.Field<int>("RowNo") == 1
    select myRow; //select the thing you want, not the collection

또한 프로젝트 참조를 추가해야합니다. System.Data.DataSetExtensions


답변

var query = from p in dt.AsEnumerable()
                    where p.Field<string>("code") == this.txtCat.Text
                    select new
                    {
                        name = p.Field<string>("name"),
                        age= p.Field<int>("age")
                    };

이름 및 연령 필드는 이제 쿼리 개체의 일부이며 다음과 같이 액세스 할 수 있습니다. Console.WriteLine (query.name);


답변

나는 이것이 몇 번 이상 대답되었지만 다른 접근 방식을 제공한다는 것을 알고 있습니다.

나는이 .Cast<T>()방법 을 사용하고 싶습니다 . 명시 적 유형이 정의되어 있고 깊이 있다고 생각하면 정신을 유지하는 데 도움이됩니다 .AsEnumerable().

var results = from myRow in myDataTable.Rows.Cast<DataRow>()
                  where myRow.Field<int>("RowNo") == 1 select myRow;

또는

var results = myDataTable.Rows.Cast<DataRow>()
                      .FirstOrDefault(x => x.Field<int>("RowNo") == 1);

의견에서 언급했듯이 Linq의 일부이므로 다른 어셈블리가 필요하지 않습니다 ( Reference )


답변

LINQ를 사용하여 DataSet / DataTable의 데이터 조작

var results = from myRow in tblCurrentStock.AsEnumerable()
              where myRow.Field<string>("item_name").ToUpper().StartsWith(tbSearchItem.Text.ToUpper())
              select myRow;
DataView view = results.AsDataView();