İşte bir fikir: LINQ'yi dinamikle birleştirerek, yazılmamış veri kümelerini yazdıklarına benzer şekilde sorgulayabilirsiniz. Örneğin, benim DataSet'in bir türlenmemiş DataSet olduğunu varsayalım. Dinamik yazarak ve AsDynamic (denilen bir uzantısı yöntemiyle) ile aşağıdaki mümkündür:
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 };
İşte AsDynamic uzatma yöntemini tanımlamak nasıl. uygundur LINQ sorguları için yapar, bu dinamiğin IEnumerable döndürür nasıl Uyarı:
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);
}
}
}
DynamicObject sınıflara olarak, bu özel bağlama yararlanır - Eğer üye adlarını kendiniz belirleme süreci devralacak nerede. Bu durumda, temel DataRow'daki nesneleri almak veya saklamak için get ve set üye erişimini bağlarız.
Ben dinamik nesne üzerinde bir Linq sorgusu yaparsanız, ben 'almak hata CS1979: kaynak türü üzerinden Sorgu ifadeleri 'dinamik' ya allowed' olmayan türü 'dinamik' bir katılmak dizisi ile: S. –
Dinamikler ile LINQ kullanmanın mevcut sınırlamalarını ve etraflarında çalışmanın bazı yollarını biraz okuma: http://weblogs.asp.net/davidfowler/archive/2010/08/04/dynamic-linq-a-little- more-dynamic.aspx – egoodberry