![](/img/trans.png)
[英]C# compiler error CS1963: "An expression tree may not contain a dynamic operation"
[英]Why does C# compiler allow use of a dynamic operation in expression tree if ToList or ToArray is called
請注意:我知道這里討論了許多與主要錯誤消息相關的信息,但是我找不到任何討論我的問題的帖子。
因此,在將此標記為重復項之前,請務必仔細閱讀。
與往常一樣,如果您能指出一個討論我困惑的問題的問題,我很樂意回答這個問題。
我有一個返回IQueryable的方法,如下所示
public IQueryable<dynamic> GetData(DateTime Start, DateTime End, Nullable<int> EmployeeId = null)
{
var query = from T1 in Context.Table1
join T2 in Context.Table2
on T1.Col1 equals T2.Col1
join T3 in Context.Table3
on T2.Col1 equals T3.Col1
where T1.Col1 == EmployeeId
&& T1.Col2 >= Start
&& T1.Col2 <= End
select new
{
Value1 = T1.Col1,
Value2 = T2.Col5,
Value3 = T3.Col7
};
return query;
}
請注意,由於表的敏感性,我不得不刪除表名和列名。
問題:
我想從另一個類中獲取Value3的總和。
private float getTargetScore()
{
return GetData().Sum(rec => Convert.ToSingle(rec.Value3));
}
這給了我下面的編譯器錯誤。
表達式樹可能不包含動態操作
令人困惑的部分:
如果在調用Sum()之前添加.ToList()或.ToArray(),則不會出現此編譯器錯誤
private float getTargetScore()
{
return GetData().ToArray().Sum(rec => Convert.ToSingle(rec.Value3));
}
我知道.ToList()或.ToArray()實現查詢(在這種情況下從數據庫中獲取數據)並導致IEnumerable <>而不是IQueryable <>, 但是為什么C#編譯器允許我使用動態操作在這里表達嗎?
注意:C#的版本為4.0(.Net 4.0)
在第一種情況下,您正在調用IQueryable.Sum
public static int Sum<TSource>(this IQueryable<TSource> source,
Expression<Func<TSource, int>> selector)
在第二種情況下,您正在調用IEnumerable.Sum
public static int Sum<TSource>(this IEnumerable<TSource> source,
Func<TSource, int> selector)
因此,在第一種情況下,編譯器嘗試從lambda表達式創建表達式樹 ,但由於使用動態,因此無法做到。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.