Подтвердить что ты не робот

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

Я работаю с .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 выбирать, но разрешает для каждого <? >

4b9b3361

Ответ 1

Проблема заключается в том, что topAgents - dynamic - поэтому ваш вызов ToList() является динамическим, и это значит Select. У этого есть проблемы, которые:

  • вы не можете использовать лямбда-выражения для динамических вызовов, например:
  • динамические вызовы в любом случае не найдут методы расширения.

К счастью, операции не обязательно должны быть динамическими только потому, что тип элемента является динамическим. Вы можете использовать:

IEnumerable<dynamic> topAgents = ...;

... или просто используйте var. Оба они должны быть в порядке.