ParseException: нет свойства или поля '???' существует в типе "DynamicClass" при использовании GroupBy и Select
Я использую EntityFramework вместе с System.Linq.Dynamic и определил класс Employee POCO следующим образом:
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();
шоу
1 ответ
Решение
Я создал метод расширения, который получает свойство от объекта и приводит его к требуемому типу.
Смотрите этот код для расширения метода "Выбрать"
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.