1. ホーム
  2. c#

[解決済み] ラムダ式をデリゲートまたは式木型にキャストせずに、動的にディスパッチされる操作の引数として使用できない

2023-05-15 08:35:29

質問

私は.NET4.5とVS2013で作業しており、以下のクエリがあります。 dynamic の結果をデータベースから取得します。

dynamic topAgents = this._dataContext.Sql(
    "select t.create_user_id as \"User\", sum(t.netamount) as \"Amount\" from transactiondetail t where t.update_date > sysdate -7 group by t.create_user_id")
    .QueryMany<dynamic>();

以下の文はコンパイルエラーで失敗します。 Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type を実行することさえできません。

topAgents.ToList().Select(agent => new
{
    User = agent.User != null ? string.Format("{0}", agent.User).Replace("CORPNTGB\\", "") : null,
    Amount = agent.Amount
});

であるのに対し、この foreach はうまく動作します。

var data = new List<List<object>>();
foreach (dynamic agent in topAgents)
{
    data.Add(new List<object>
    {
        agent.User != null ? string.Format("{0}", agent.User).Replace("CORPNTGB\\", "") : null,
        agent.Amount
    });
}

私の目に映ったのは topAgents.ToList() は等価であると解釈されます。 var data = new List<List<object>>(); と明示的に記述しているため、コンパイラによって2番目の記述が許可されるのでしょうか?

なぜコンパイラはLINQのselectを許さず、for each`を許すのですか?

どのように解決するのですか?

問題点は topAgentsdynamic - であるため、あなたの ToList() の呼び出しは動的であり、同様に Select . という問題があります。

  1. このような動的な呼び出しにラムダ式を使用することはできません。
  2. 動的な呼び出しでは、拡張メソッドを見つけることができません。

幸いなことに、操作が動的である必要はなく、ただ単に 要素 の型が動的であるからといって、操作が動的である必要はありません。使うことができる。

IEnumerable<dynamic> topAgents = ...;

... あるいは、単に var . どちらも問題ないはずです。