Entity Framework 4.1: репозиторий со «свойством DefaultOrder» - PullRequest
1 голос
/ 23 апреля 2011

При использовании следующего кода (упрощенно) я получаю сообщение об ошибке

"Невозможно привести тип 'System.DateTime' к типу 'System.Object'. LINQ to Entities поддерживает только приведениеТипы примитивов Entity Data Model. "

в строке с оператором возврата:

public MyRepository<Post>
{
  public Expression<Func<Post, object>> DefaultOrder;

  public MyRepository()
  {
    DefaultOrder = p => p.PublishedOn;
  }

  public IQueryable<Post> All()
  {
    var entities = new MyDbContext().Set<Post>();
    return entities.OrderByDescending(DefaultOrder);
  }
}

Я использовал тот же код с db4o / db4o.Linq вместо Entity Framework и тампроблем не было.

Итак, мои вопросы:

  1. Почему происходит эта ошибка?
  2. Существует ли альтернативное решение, которое позволяет мне определить свой DefaultOrder втаким же (похожим) образом, как я делаю сейчас?

РЕДАКТИРОВАТЬ:

Нашел решение , которое работает для меня, заменилвыражение заказа по умолчанию с методом заказа:

public MyRepository<T>
{
  public Func<IQueryable<T>, IOrderedQueryable<T>> DefaultOrderMethod;

  public MyRepository()
  {
    DefaultOrderMethod = o => o.OrderBy(x => x.PublishedOn);
  }

  public IQueryable<T> All()
  {
    var entities = new MyDbContext().Set<T>();
    return DefaultOrderMethod(entities);
  }
}

1 Ответ

1 голос
/ 23 апреля 2011

Второй тип выражения, переданного в метод расширения OrderBy, выводится из типа, возвращаемого выражением.Это ожидает выражения>.Поэтому, если вы собираетесь хранить выражение сортировки, вам нужно явно присвоить ему тип TOrderBy.

public MyRepository<Post>
{
  public Expression<Func<Post, DateTime>> DefaultOrder;

  public MyRepository()
  {
    DefaultOrder = p => p.PublishedOn;
  }

  public IQueryable<Post> All()
  {
    var entities = new MyDbContext().Set<Post>();
    return entities.OrderByDescending(DefaultOrder);
  }
}

.NET не поддерживает упаковку / распаковку универсального типа параметра, если вы не используете .NET 4.0и используйте интерфейсы через ковариацию и контравариантность, которые не будут работать для вашего примера.

Опять же, это просто, как работает общая система в .NET.Единственная причина, по которой это работает ...

Query.OrderBy(x => x.PublishedOn)

... в том, что тип TOrderBy может быть выведен из типа возвращаемого выражения (DateTime).

...