.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 선택을 허용하지 않는 이유는 무엇입니까?
답변
문제는 즉 topAgents
이다 dynamic
– 당신 때문에 ToList()
호출이 너무 역동적이고,이다 Select
. 다음과 같은 문제가 있습니다.
- 이와 같은 동적 호출에는 람다 식을 사용할 수 없습니다.
- 동적 호출은 어쨌든 확장 메서드를 찾지 않습니다.
다행히도 요소 유형이 동적 이기 때문에 작업이 동적 일 필요는 없습니다 . 다음을 사용할 수 있습니다.
IEnumerable<dynamic> topAgents = ...;
… 또는 그냥 var
. 둘 다 괜찮습니다.