2013-04-06 5 views
1

Я использую EntityFramework вместе с System.Linq.Dynamic и я определил класс Employee POCO следующим образом:ParseException: Нет свойства или поля '???' существует в типе «DynamicClass» при использовании GroupBy и выберите

public class Employee 
{ 
    public long Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public Company Company { get; set; } 
    public Country Country { get; set; } 
} 


Я использую этот код, чтобы сделать GroupBy странового Названия:

var query = Employees.Include(e => e.Company).Include(e => e.Country); 
var groupByQuery = query.GroupBy("new (Country.Code as GroupByField)", "new (it AS XEmployee, it.Company AS XCompany, it.Country AS XCountry)"); 
var selectQuery = groupByQuery.Select("new (Key.GroupByField, it as Grouping)"); 
var grouping = selectQuery.Select("it.Grouping") as IQueryable<IGrouping<DynamicClass, DynamicClass>>; 
var objects = grouping.First().AsQueryable() as IQueryable<object>; 

// This line gives me : ParseException: No property or field 'XEmployee' exists in type 'DynamicClass' 
var employees = objects.Select("it.XEmployee"); 

это очень странно, потому что, когда я сбросить все свойства из DynamicClass, то XEmployee является действительным общественным достоянием?

var firstObject = objects.First(); 
firstObject.GetType().GetProperties().Dump(); 

показывает enter image description here

ответ

0

Я создал метод расширения, который получает свойство от объекта и преобразует его к нужному типу.

Смотрите этот код для метода расширения "Select"

public static class DynamicQueryableExtensions 
{ 
    public static IEnumerable<TEntity> Select<TEntity>(this IEnumerable<object> source, string propertyName) 
    { 
     return source.Select(x => GetPropertyValue<TEntity>(x, propertyName)); 
    } 

    private static T GetPropertyValue<T>(object self, string propertyName) 
    { 
     var type = self.GetType(); 
     var propInfo = type.GetProperty(propertyName); 

     try 
     { 
      return propInfo != null ? (T)propInfo.GetValue(self, null) : default(T); 
     } 
     catch 
     { 
      return default(T); 
     } 
    } 
} 

Код используется следующим образом:

// This line will just work fine. 
var employees = objects.Select<Employee>("XEmployee"); 
employees.Dump(); 


Для рабочего примера см мой KendoGridBinderEx проект на GitHub.