【问题标题】:Entity Framework 4.1: Repository with "DefaultOrder Property"实体框架 4.1:具有“DefaultOrder 属性”的存储库
【发布时间】:2011-04-23 19:16:24
【问题描述】:

使用以下代码(简化)时,出现错误

“无法将类型 'System.DateTime' 转换为类型 'System.Object'。LINQ to Entities 仅支持转换实体数据模型原始类型。”

在返回语句所在的行:

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);
  }
}

【问题讨论】:

  • 您是否尝试过提前进行选角? (DefaultOrder= p=&gt; (object) p.PublishedOn;)
  • 好主意! - 但不幸的是不起作用...

标签: entity-framework c#-4.0 linq-to-entities sql-order-by


【解决方案1】:

传递给 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 =&gt; x.PublishedOn)

... 是因为 TOrderBy 类型可以从表达式返回类型(DateTime)中推断出来。

【讨论】:

  • 感谢您的解释。尽管在我编写相同的代码时有效,但当我使用 db4o 和相同的代码时。有什么想法吗?
  • 您知道如何以不同的方式实现此功能吗?
  • 您可以通过多种不同的方式进行操作,但我怀疑您能否实现您希望的最终结果,这只是 .NET 的一个限制。
  • 由于您的解释接受了您的回答。用我在此期间找到的解决方案更新了我的原始帖子...
猜你喜欢
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 2018-07-04
  • 2012-03-24
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多