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


78

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


2
않습니다 topAgents해야 dynamic? var대신 사용하면 작동합니까 ?
DavidG 2014

답변:


107

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

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

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

IEnumerable<dynamic> topAgents = ...;

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


고마워요, topAgents dynamic모든 시간 을 어떻게 든 보지 못했습니다 .
Matas Vaitkevicius 2014
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.