tôi thường cung cấp cho bản thân các phương thức mở rộng khi tôi cần xử lý đối tượng trước LINQ như một đối tượng LINQ đã sẵn sàng. Ví dụ, bạn đang tìm kiếm để truy vấn trên một DataRowCollection (DataTable.Rows bất động sản) mà bạn có thể không sử dụng cho bất cứ điều gì nhiều hơn một danh sách các DataRows. Tôi sẽ làm cho một phương pháp mở rộng mà không chuyển đổi này cho bạn (DataRowCollection để List<DataRow>
). Tôi cũng thường sử dụng một phương pháp mở rộng để có được các giá trị một cách an toàn khi tôi không quan tâm để ném một ngoại lệ nếu vì một lý do nào đó một tên khóa không hợp lệ được cung cấp cho cột. Sau đó, bạn có thể tạo một phương thức mở rộng có danh sách các int như id và một tên trường chứa id để trả về những gì bạn muốn. Khi tất cả được nói và thực hiện, điều này được thực hiện với một dòng mã. Đây là lớp học với tất cả các phương pháp mở rộng của bạn.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace ConsoleApplication11
{
public static class SystemDataHelpers
{
public static List<DataRow> RowList(this DataTable table)
{
List<DataRow> list = new List<DataRow>();
foreach (DataRow row in table.Rows)
list.Add(row);
return list;
}
public static object GetItem(this DataRow row, string field)
{
if (!row.Table.Columns.Contains(field))
return null;
return row[field];
}
public static List<DataRow> GetRows(this DataTable table, List<int> ids, string fieldName)
{
Func<DataRow, bool> filter = row => ids.Contains((int)row.GetItem(fieldName));
return table.RowList().Where(filter).ToList();
}
}
}
Sau đó, ngoài việc thiết lập các biến (bạn không cần phải làm ... bạn đã có chúng), công việc thực hiện được thực hiện với một dòng mã (EDIT: một cuộc gọi phương thức duy nhất):
DataTable table = new DataTable();
List<int> rowIds = new List<int> { 1, 2, 3, 4 };
string idFieldName = "row_id";
List<DataRow> selected = table.GetRows(rowIds, idFieldName);
Một cách để chuyển đổi thành một datatable là sử dụng .CopyToDataTable(), trong trường hợp này hãy đảm bảo kiểm tra xem matchingRows.Any() có trả về true trước khi thực hiện matchingRows.CopyToDataTable() hay không. Điều này đòi hỏi System.Data.DataTableExtensions – Enrico