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(this IQueryable 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
}
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.
Comments
Comment 1
Anonymous - on Aug 4 2008 at 5:14 PM
No, je, ale našel jsem jej asi až na druhý pokus. How to Implement CopyToDataTable Where the Generic Type T Is Not a DataRow : http://msdn.microsoft.com/en-us/library/bb669096.aspx
Comment 2
Anonymous - on Jun 16 2009 at 11:01 AM
Ahoj, chybí ti tam ošetření nullable typů, a taky jsem našel ještě druhou zajímavou možnost a to použití přímo dotazu z linq2sql