[c#] 람다 식을 대리자 또는 식 트리 형식으로 먼저 캐스팅하지 않고 동적으로 전달되는 작업에 대한 인수로 사용할 수 없습니다.

.NET4.5 및 VS2013으로 작업 중이며 dynamicdb에서 결과 를 얻는 쿼리가 있습니다.

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 선택을 허용하지 않는 이유는 무엇입니까?



답변

문제는 즉 topAgents이다 dynamic– 당신 때문에 ToList()호출이 너무 역동적이고,이다 Select. 다음과 같은 문제가 있습니다.

  1. 이와 같은 동적 호출에는 람다 식을 사용할 수 없습니다.
  2. 동적 호출은 어쨌든 확장 메서드를 찾지 않습니다.

다행히도 요소 유형이 동적 이기 때문에 작업이 동적 일 필요는 없습니다 . 다음을 사용할 수 있습니다.

IEnumerable<dynamic> topAgents = ...;

… 또는 그냥 var. 둘 다 괜찮습니다.


답변