Angesichts einer dynamischen Dapper-Abfrage wie:
var results = connection.Query<dynamic>("SELECT ....");
Ich möchte einige zurückgegebene Spalten / Eigenschaften aus den Ergebnissen entfernen. Der Trick ist, dass ich dies tun möchte, ohne die Namen der Eigenschaften, die ich behalten möchte, zu kennen / zu pflegen, sonst würde ich die Ergebnisse einfach in einen neuen anonymen Typ projizieren.
Ich habe versucht, die Ergebnisse IDictionary<string, object>
und sie jeweils in ein IDictionary<string, object>
so dass ich einfach das Schlüssel / Wert-Paar entfernen konnte, das die Daten IDictionary<string, object>
. Leider implementiert das zugrunde liegende interne FastExpando-Objekt aus irgendeinem Grund die Remove-Methode nicht. Der Quellcode für FastExpando zeigt an:
bool IDictionary<string, object>.Remove(string key)
{
throw new NotImplementedException();
}
Wie kann ich das umsetzen? Um klar zu sein, ich möchte im Grunde:
var filteredResults = from r in results
select new { // All properties except a couple of well-known ones }
Es gab keinen Grund, dass FastExpandoObject
diese Methoden nicht implementiert hat, außer: es hatte es nicht nötig. Ich habe jetzt alle fehlenden / NotImplementedException
Methoden NotImplementedException
. Ich habe noch nicht in NuGet implementiert, aber der Code auf github / google-code wurde aktualisiert.
Was FastExpandoObject
wenn Sie das FastExpandoObject
iterieren und ein gefiltertes ExpandoObject
?
var filteredResults = dynamicResult.Select<dynamic, dynamic>(x =>
{
var filteredRow = new ExpandoObject() as IDictionary<string, Object>;
var props = x as IDictionary<string, object>;
foreach (var prop in props)
{
if (!filter.Contains(prop.Key))
filteredRow.Add(prop);
}
return filteredRow;
});