Ich arbeite mit .NET4.5 und VS2013. Ich habe diese Abfrage, die das dynamic
Ergebnis von db erhält .
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>();
Die folgende Anweisung schlägt mit einem Kompilierungsfehler fehl, Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type
ohne dass ich sie ausführen kann
topAgents.ToList().Select(agent => new
{
User = agent.User != null ? string.Format("{0}", agent.User).Replace("CORPNTGB\\", "") : null,
Amount = agent.Amount
});
während dieser mit foreach
funktioniert gut.
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
});
}
In meinen Augen, nachdem ich topAgents.ToList()
sie als gleichwertig interpretiert haben könnte, liegt es daran, var data = new List<List<object>>();
dass ich ausdrücklich feststelle , dass diese zweite Anweisung vom Compiler zugelassen wird?
Warum erlaubt der Compiler keine LINQ-Auswahl, sondern jede?
topAgents
seindynamic
? Funktioniert es, wenn Sievar
stattdessen verwenden?Antworten:
Das Problem ist , dass
topAgents
istdynamic
- so wird IhrToList()
Anruf dynamisch ist, und so istSelect
. Das hat Probleme, die:Glücklicherweise müssen die Operationen nicht dynamisch sein, nur weil der Elementtyp dynamisch ist. Du könntest benutzen:
IEnumerable<dynamic> topAgents = ...;
... oder einfach benutzen
var
. Beides sollte in Ordnung sein.quelle
topAgents
das diedynamic
ganze Zeit war.