IQueryable do DataView
Prý nikde není k dispozici popis nebo dokonce kód pro vytvoření DataView z dotazu provedeného pomocí Linq to SQL. Tak jsem se jeden takový pokusil sestavit, byť by si určitě zasloužil ještě nějaké ty úpravy a vylepšení.
DataView ToDataView<T>(this IQueryable<T> query) where T: class
Tak toto je předpis dané extension metody, kterou je možné použít pro vytvoření DataView z dotazu. Celá metoda je velice jednoduchá a jistě ji pochopí každý, alespoń maličko zkušený vývojář. Pro ty ostatní jen malé připomenutí, jak celá metoda pracuje a provádí se převod. Nejdříve však samožná metoda.
using System.Data; using System.Reflection; using System.Collections; public static class DataExtensions { public static DataView ToDataView<T>(this IQueryable<T> query) where T: class { DataTable dt = new DataTable(); Type type = typeof(T); PropertyInfo[] pis = type.GetProperties(); foreach (var item in pis) { if (!(typeof(ICollection).IsAssignableFrom(item.PropertyType))) { DataColumn dc = new DataColumn(item.Name, item.PropertyType); dt.Columns.Add(dc); } } foreach (var item in query) { DataRow row = dt.NewRow(); foreach (var pi in pis) { if (!(typeof(ICollection).IsAssignableFrom(pi.PropertyType))) { row[pi.Name] = pi.GetValue(item, null); } } dt.Rows.Add(row); } return new DataView(dt); } }
Nejdříve je třeba zajistit vytvoření odpovídajících sloupečků. To se provede iterováním přes všechny viditelné vlastnosti třídy s tím, že vynechávám ze seznamu kolekce (EntitySety). Pro jistotu jsem však použil jen rozhraní ICollection, tak aby byly vynechány případné dodatečně definované kolekce.
Následně se již vytvářejí řádky a pomoci Reflection se plní jednotlivé řádky hodnotamy z dotazu.
Posledním krokem je poté již jen samotné vrácení DataView na výstupu z metody.