Đây là một ý tưởng: bằng cách kết hợp LINQ với động, bạn có thể truy vấn các tập dữ liệu chưa được phân loại như thể chúng được nhập. Ví dụ:
Ví dụ: giả sử rằng myDataSet là một Tập dữ liệu chưa được nhập. Với tính năng nhập động và phương thức mở rộng được gọi là AsDynamic(), bạn có thể làm như sau:
var query = from cust in myDataSet.Tables[0].AsDynamic()
where cust.LastName.StartsWith ("A")
orderby cust.LastName, cust.FirstName
select new { cust.ID, cust.LastName, cust.FirstName, cust.BirthDate };
Dưới đây là cách xác định phương pháp mở rộng AsDynamic. Chú ý cách nó trả IEnumerable năng động, mà làm cho nó phù hợp cho các truy vấn LINQ:
public static class Extensions
{
public static IEnumerable<dynamic> AsDynamic (this DataTable dt)
{
foreach (DataRow row in dt.Rows) yield return row.AsDynamic();
}
public static dynamic AsDynamic (this DataRow row)
{
return new DynamicDataRow (row);
}
class DynamicDataRow : DynamicObject
{
DataRow _row;
public DynamicDataRow (DataRow row) { _row = row; }
public override bool TryGetMember (GetMemberBinder binder, out object result)
{
result = _row[binder.Name];
return true;
}
public override bool TrySetMember (SetMemberBinder binder, object value)
{
_row[binder.Name] = value;
return true;
}
public override IEnumerable<string> GetDynamicMemberNames()
{
return _row.Table.Columns.Cast<DataColumn>().Select (dc => dc.ColumnName);
}
}
}
By subclassing DynamicObject, điều này lợi dụng tùy chỉnh ràng buộc - nơi bạn đi qua quá trình giải quyết tên thành viên cho mình. Trong trường hợp này, chúng ta ràng buộc việc truy cập thành viên và thiết lập để truy xuất hoặc lưu trữ các đối tượng trong DataRow bên dưới.
Nguồn
2010-11-07 14:42:45
Nếu tôi thực hiện truy vấn LINQ trên đối tượng động, tôi nhận được 'lỗi CS1979: Biểu thức truy vấn trên loại nguồn 'động' hoặc với chuỗi tham gia thuộc loại 'động' không được phép': S. –
Đọc một chút về những hạn chế hiện tại của việc sử dụng LINQ với các động lực và một số cách làm việc xung quanh chúng: http://weblogs.asp.net/davidfowler/archive/2010/08/04/dynamic-linq-a-little- more-dynamic.aspx – egoodberry