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();