2015-11-02 3 views
1

У меня проблема с этим фрагментом кода. я использовать Linq для лицаFunc <T> в выражении 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)) 

Тип узла выражение LINQ «Загружает» не поддерживается в LINQ to Entities

Помогите мне решить эту проблему? Я должен использовать LINQkit или другое?

+0

Вы уверены, что это ошибка компиляции? – DavidG

+0

извините, я на VS 2015. , когда я запустил свою веб-страницу, чтобы проверить программное обеспечение, зависает и назначил мне эту ошибку и выделяет строку кода. Я не вижу свою веб-страницу. – pyriame

ответ

1

В вашем коде есть две основные проблемы.

Во-первых, ни Enumerable, ни Queryable имеет метод Sum для byte, так что ближе будет тот, который работает с int.

Во-вторых, и что более важно, LINQ к Entities в основном работает с Quearyable, который, в свою очередь, использует Expression<Func<...>> (в отличие от Enumerable, который использует только Func<...>). Ваш код пытается совместить их, создавая выражение из func, но, как говорится в сообщении об ошибке, это не поддерживается.

Решение состоит в том, чтобы построить выражение с помощью классов/методов от System.Linq.Expressions имен - Expression.Parameter для создания параметра (ов), Expression.Property для доступа к свойствам (ов), Expression.Convert для изменения типа и Expression.Lambda, чтобы поместить их всех вместе, как this

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);      
} 
+0

Thx Thx Thx Ivan. Идеально ! – pyriame

Смежные вопросы