Невозможно привести тип «System.String» к типу «System.Object». LINQ to Entities поддерживает только приведение типов примитивов Entity Data Model - PullRequest
2 голосов
/ 11 июля 2010

Я использую EF 4, но при попытке упорядочить список выдает ошибку.

Unable to cast the type 'System.String' to type 'System.Object'. LINQ to Entities only supports casting Entity Data Model primitive types.

Это мой код для получения эксперимента, введя имя свойства, в примере ниже получите Имя клиента

var param = Expression.Parameter(typeof(Customer), "N");

var sortExpression = Expression.Lambda<Func<T, object>>
            (Expression.Convert(Expression.Property(param, "Name"), typeof(object)), param);

И мой код EF

GetObjectSet<T>().AsQueryable().OrderBy(sortExpression).Skip(0).Take(5);

Я знаю, что это какая-то проблема с EF, потому что она работает без EF, но выдает мне эту ошибку, когда я подключаю ее к EF.Есть ли работа вокруг или что-то, потому что я не хочу использовать LINQ.

Ответы [ 3 ]

0 голосов
/ 06 марта 2014

Я столкнулся с той же проблемой и решил следующий код:

IQueryable<T> result = DbSet.AsQueryable<T>();
var classPara = Expression.Parameter(typeof(T), "t");
var pi = typeof(T).GetProperty(sortPara);
result = result.Provider.CreateQuery<T>(
                    Expression.Call(
                        typeof(Queryable),
                        "OrderBy",
                        new Type[] { typeof(T), pi.PropertyType },
                        result.Expression,
                        Expression.Lambda(Expression.Property(classPara , pi), classPara ))
                    );
0 голосов
/ 11 января 2018

У меня была та же проблема, и метод, который ее решил, был:

using System; 
 using System.Collections.Generic; 
 using System.Linq; 
 using System.Linq.Expressions; 


public class GenericSorter<T> {
public IEnumerable<T> Sort(IEnumerable<T> source, string sortBy, string sortDirection)
{
    var param = Expression.Parameter(typeof(T), "item");

    var sortExpression = Expression.Lambda<Func<T, object>>
        (Expression.Convert(Expression.Property(param, sortBy), typeof(object)), param);

    switch (sortDirection.ToLower())
    {
        case "asc":
            return source.AsQueryable<T>().OrderBy<T, object>(sortExpression);
        default:
            return source.AsQueryable<T>().OrderByDescending<T, object>(sortExpression);

    } 
}

}

Тогда вы можете вызвать ее, когда выполните запрос как:

var entity = nameof(DBOEntity.Property);
var order = "asc";
var query = dc.EntityDataSet.AsExpandable().OrderByDynamic(entity, order);

Надеюсь, это поможет вам!

0 голосов
/ 11 июля 2010

Я считаю, этот ответ касается того, что вы пытаетесь сделать самым простым способом.

...