Это вопрос по моему вопросу Dynamic Expression Generation Issues with ValueTypes добавление новой переменной: Entity Framework. Теперь, когда я могу генерировать необходимые выражения при работе с ValueTypes, у меня возникает новая проблема, когда Linq-to-Entities пытается обработать запрос. Я получаю следующее сообщение об ошибке:Вставка значений с использованием Linq в объекты
System.NotSupportedException: Unable to cast the type 'System.Int32' to type 'System.Object'. LINQ to Entities only supports casting EDM primitive or enumeration types.
По-видимому, Linq-to-Entities не является поклонником значений в штучной упаковке. Это работает, когда я принудительно обрабатываю запрос (через ToList()
или другой метод типа), но не тогда, когда это делается с помощью базы данных, которая была бы идеальной.
Есть ли способ сделать этот метод более универсальным, чтобы сделать Linq-to-Entities счастливым? Имейте в виду, что я не знаю тип свойства до выполнения.
public IEnumerable<Expression<Func<T, object>>> GetExpressions<T>(string sortedColumn) where T : IReportRecord
{
var columns = GetFullSortOrder(sortedColumn);
var typeParameter = Expression.Parameter(typeof(T));
foreach (var c in columns)
{
var propParameter = Expression.Property(typeParameter, c);
if (propParameter.Type.IsValueType)
{
var boxedPropParameter = Expression.Convert(propParameter, typeof(object));
yield return Expression.Lambda<Func<T, object>>(boxedPropParameter, typeParameter);
}
else
{
yield return Expression.Lambda<Func<T, object>>(propParameter, typeParameter);
}
}
}
Вместо генерации 'Expressions' вы можете применять ваш заказ непосредственно к' IQueryable' динамически следующим образом: http://stackoverflow.com/questions/41244/dynamic-linq-orderby-on-ienumerablet/233505#233505 – Aducci