使用LinQ实体的Lambda表达式中的Func <t>

时间:2015-11-02 11:08:22

标签: c# entity-framework linq lambda

我对这段代码有疑问。我使用LinQ实体

Dictionary<string, int> dictionary = new Dictionary<string, int>();
using (var db = new DiagEntities())
{
    PropertyInfo[] properties = typeof(DiagTab).GetProperties();

    foreach (PropertyInfo property in properties)
    {

        string name = property.Name;
        if (name == "ID_Diag") { continue; } // no column 1 and 2 
        if (name == "Reponse") { continue; } 

        Func<DiagTab, byte> accessor = (Func<DiagTab, byte>)property
                                            .GetMethod
                                            .CreateDelegate(typeof(Func<DiagTab, byte>));

        int sum = db.DiagTabs.Sum(p => accessor(p));  // invoke error

        dictionary.Add(name, sum);                      
    }
    bouba.DataSource = dictionary;
    bouba.DataBind();

汇编我在这一行上出现了这个错误,我不明白为什么:

int sum = db.DiagTabs.Sum(p => accessor(p))
  

节点类型&#39;调用&#39; LINQ to Entities

不支持LINQ表达式

你能帮我解决这个问题吗?我应该使用LINQkit还是其他?

1 个答案:

答案 0 :(得分:1)

您的代码存在两个主要问题。

首先,EnumerableQueryable都没有Sum的{​​{1}}方法,因此最接近的方法是byte

第二个也是更重要的,LINQ to Entities主要使用int,后者使用Queryable(与仅使用Expression<Func<...>>的{​​{1}}相比)。您的代码正在尝试通过从func创建表达式来组合它们,但正如错误消息所述,这是不受支持的。

解决方案是使用Enumerable命名空间中的类/方法构建表达式 - Expression.Parameter用于创建参数,Expression.Property用于属性访问器,{{3更改类型和Expression.Convert将它们放在一起,就像这样

Func<...>