Неможливо використовувати лямбда-вираз як аргумент для динамічно відправленої операції без попередньої передачі його до типу делегата або дерева виразів


78

Я працюю з .NET4.5 та VS2013, у мене є цей запит, який отримує dynamicрезультат від db.

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>>();це друге твердження дозволено компілятором?

Чому компілятор не дозволяє вибрати LINQ, а дозволяє кожен з них?


2
Чи topAgentsповинно бути dynamic? Це працює, якщо ви використовуєте varзамість цього?
DavidG

Відповіді:


107

Проблема полягає в тому, що topAgentsце dynamic- так що ваш ToList()виклик є динамічним, і так Select. Це має проблеми, які:

  1. ви не можете використовувати лямбда-вирази для таких динамічних викликів;
  2. динамічні виклики все одно не знаходять методів розширення.

На щастя, операції не повинні бути динамічними лише тому, що тип елемента є динамічним. Ви можете використовувати:

IEnumerable<dynamic> topAgents = ...;

... або просто використовувати var. І те, і інше має бути добре.


Дякую, я якось не побачив, що це topAgents було dynamicвесь цей час.
Матас Вайткевічус,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.