C# Func<;T>;在具有LinQ to实体的Lambda表达式中

C# Func<;T>;在具有LinQ to实体的Lambda表达式中,c#,entity-framework,linq,lambda,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 prope

我对这段代码有问题。我使用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();
LINQ to实体中不支持节点类型“Invoke”LINQ表达式


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

您的代码有两个主要问题

首先,无论是
可枚举的
还是
可查询的
都没有
求和
方法来表示
字节
,因此最接近的方法应该是使用
int
的方法

第二,也是更重要的一点,LINQ to Entities主要与
可查询
一起工作,后者反过来使用
表达式
(而
可枚举
只使用
函数
)。您的代码试图通过从func创建表达式来组合它们,但正如错误消息所述,这是不受支持的

解决方案是使用
System.Linq.Expressions
命名空间中的类/方法构建表达式-用于创建参数、属性访问器、更改类型并将它们放在一起,如下所示

foreach (var property in typeof(DiagTab).GetProperties())
{    
    string name = property.Name;
    if (name == "ID_Diag") { continue; } // no column 1 and 2 
    if (name == "Reponse") { continue; } 

    // selector = (DiagTab source) => (int)source.Property
    var source = Expression.Parameter(typeof(DiagTab), "source");
    var selector = Expression.Lambda<Func<DiagTab, int>>(
        Expression.Convert(Expression.Property(source, property), typeof(int)),
        source);

   int sum = db.DiagTabs.Sum(selector);
   dictionary.Add(name, sum);                      
}
foreach(typeof(DiagTab).GetProperties()中的var属性)
{    
字符串名称=property.name;
if(name==“ID_Diag”){continue;}//没有第1列和第2列
如果(name==“Reponse”){continue;}
//选择器=(DiagTab源)=>(int)source.Property
var source=表达式参数(typeof(DiagTab),“source”);
var选择器=表达式.Lambda(
Expression.Convert(Expression.Property(source,Property),typeof(int)),
来源);
int sum=db.diagtables.sum(选择器);
添加(姓名、金额);
}

您确定这是编译错误吗?对不起,我在VS 2015上。当我运行我的网页来测试软件时,挂起并指定我这个错误,并突出显示代码行。我看不到我的网页。谢谢谢谢谢谢伊万。太完美了!
foreach (var property in typeof(DiagTab).GetProperties())
{    
    string name = property.Name;
    if (name == "ID_Diag") { continue; } // no column 1 and 2 
    if (name == "Reponse") { continue; } 

    // selector = (DiagTab source) => (int)source.Property
    var source = Expression.Parameter(typeof(DiagTab), "source");
    var selector = Expression.Lambda<Func<DiagTab, int>>(
        Expression.Convert(Expression.Property(source, property), typeof(int)),
        source);

   int sum = db.DiagTabs.Sum(selector);
   dictionary.Add(name, sum);                      
}