簡體   English   中英

如果調用ToList或ToArray,為什么C#編譯器允許在表達式樹中使用動態操作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM