【问题标题】:Problem using OrderBy with the entity framework and ObjectContext.CreateQuery(T)将 OrderBy 与实体框架和 ObjectContext.CreateQuery(T) 一起使用时出现问题
【发布时间】:2009-11-07 20:24:57
【问题描述】:

我在使用这种方法时遇到了问题:

public ObjectQuery<E> DoQuery(string columnName, int maximumRows, int startRowIndex)
{
    var result = (ObjectQuery<E>)_ctx.CreateQuery<E>
    ("[" + typeof(E).Name + "]").OrderBy(/*???*/).Skip<E>(startRowIndex).Take(maximumRows);

    return result;
}

我不确定OrderBy 部分需要做什么。我试过省略.OrderBy,但它最终给了我一个错误,说它需要订购以便我可以获取一定数量的行。

我想按 ID 字段订购。在一种情况下,我的实体名称为 Row,该实体的 ID 名为 RowID

有人知道我如何通过 ID 字段订购吗?

注意:这是一个使用实体框架的通用存储库。传入的 columnName 是我要排序的列,但它可能只是 ID 字段的名称。

【问题讨论】:

    标签: c# asp.net-mvc entity-framework repository sql-order-by


    【解决方案1】:

    你只要这样做:

    .OrderBy("it.Id")
    

    ...假设您的 ID 字段称为“Id”。在查询生成器中,“它”表示实体。参考this page

    【讨论】:

      【解决方案2】:

      当我创建我的存储库时,我假设每个 EntityObject 都有 ID 属性。然后我创建了存储库:

      public class Repository<T> : IRepository<T> where T : EntityObject, IBasicEntityInfo
      

      IBasicEntityInfo:

      public interface IBasicEntityInfo
      {
          int ID { get; set; }
      }
      

      然后

      OrderBy(a => a.ID)
      

      自动生成的EntityObject类没有实现IBasicEntityInfo接口,但是我使用T4来生成:

      public partial class User : IBasicEntityInfo ,ILastModificationInfo
      public partial class Project : IBasicEntityInfo ,ILastModificationInfo
      public partial class Group : IBasicEntityInfo ,ILastModificationInfo
      public partial class GroupUser : IBasicEntityInfo 
      public partial class OperationSystem : IBasicEntityInfo ,ILastModificationInfo
      

      T4 很简单:

      <#@ template language="C#" #>
      <#@ output extension="cs" #>
      <#@ import namespace="System.Collections.Generic" #>
      using System;
      using System.Collections.Generic;
      using System.ComponentModel;
      using System.Data;
      using System.Web;
      
      <# 
          String[] classNames = new String[] {"User","Project","Group","GroupUser","OperationSystem","TaskType","Priority","Severity","Status","Version","Platform","Task","TaskUser","Attachment","Comment","Setting"}; 
      #>
      namespace CamelTrap.Models
      {
      <# foreach(String className in classNames) { #>
          public partial class <#= className #> : IBasicEntityInfo
          {   
          }
      <# } #>
      }
      

      做出这样的假设也解决了其他问题,让我免于创建复杂的表达式。

      【讨论】:

      • 这在很多方面都很有用(我们做几乎相同的事情),但实际上并不能帮助解决他遇到的问题。
      • 它确实解决了问题,因为您可以使用 OrderBy(a => a.ID)。我的存储库通过实现 IBasicEntityInfo 知道每个对象都有 ID 属性。
      • 在他这个级别,他不知道E的具体类型。因此,您评论中的 OrderBy 将不起作用。他也不能可靠地将E 转换为IBasicEntityInfo,除非他对E 有约束,这有其自身的缺点。
      猜你喜欢
      • 2012-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多