1

次のような動的なDapperクエリが与えられます。

var results = connection.Query<dynamic>("SELECT ....");

結果から返された列/プロパティのいくつかを削除したいと思います。秘訣は、保持したいプロパティの名前を知らない/気にせずにこれを実行したいということです。そうしないと、結果を新しい匿名タイプに投影するだけです。

結果をループしてそれぞれをにキャストしようとしたIDictionary<string, object>ので、データを保持しているキーと値のペアを簡単に削除できました。残念ながら、何らかの理由で、基盤となる内部FastExpandoオブジェクトはRemoveメソッドを実装していません。FastExpandoのソースコードは次のとおりです。

bool IDictionary<string, object>.Remove(string key)
{
    throw new NotImplementedException();
}

どうすればこれを実装できますか?明確にするために、私は基本的に欲しいです:

var filteredResults = from r in results
                      select new { // All properties except a couple of well-known ones }
4

2 に答える 2

3

これらのメソッドを実装しなかった理由はFastExpandoObject、必要がなかったということ以外にはありませんでした。これで、不足している/NotImplementedExceptionメソッドをすべて入力しました。まだNuGetにデプロイしていませんが、github/google-codeのコードが更新されています。

于 2012-10-18T06:13:59.627 に答える
3

を繰り返してFastExpandoObject、フィルタリングされたものを返すとどうなります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;
                    });
于 2012-10-17T06:54:23.547 に答える