c# - 首先使用实体​​框架代码为存储库实现通用方法

标签 c# entity-framework c#-4.0 entity-framework-4 entity-framework-4.1

我正在使用 Entity Framework 4.1repository pattern .

我正在尝试创建将在大多数场景中使用的方法。我正在尝试创建一种方法来返回记录并根据提供的顺序标准对其进行排序。它可以按 1、2 或 3 列排序。我想指定这个。我在 Orchard framework 中找到了以下代码.

IRepository interface他们有以下方法(我省略了其他方法):

public interface IRepository<T>
{
     IEnumerable<T> Fetch(Expression<Func<T, bool>> predicate);
     IEnumerable<T> Fetch(Expression<Func<T, bool>> predicate, Action<Orderable<T>> order);
}

IEnumerable<T> Fetch(Expression<Func<T, bool>> predicate, Action<Orderable<T>> order); 的实现是:

public class Repository<T> : IRepository<T>
{
     public virtual IQueryable<T> Fetch(Expression<Func<T, bool>> predicate)
     {
          return Table.Where(predicate);
     }

     public virtual IQueryable<T> Fetch(Expression<Func<T, bool>> predicate, Action<Orderable<T>> order)
     {
          var orderable = new Orderable<T>(Fetch(predicate));
          order(orderable);
          return orderable.Queryable;
     }
}

Orderable class :

public class Orderable<T>
{
     private IQueryable<T> _queryable;

     public Orderable(IQueryable<T> enumerable)
     {
          _queryable = enumerable;
     }

     public IQueryable<T> Queryable
     {
          get { return _queryable; }
     }

     public Orderable<T> Asc<TKey>(Expression<Func<T, TKey>> keySelector)
     {
          _queryable = _queryable
               .OrderBy(keySelector);
          return this;
     }

     public Orderable<T> Asc<TKey1, TKey2>(Expression<Func<T, TKey1>> keySelector1,
          Expression<Func<T, TKey2>> keySelector2)
     {
          _queryable = _queryable
               .OrderBy(keySelector1)
               .OrderBy(keySelector2);
          return this;
     }

     public Orderable<T> Asc<TKey1, TKey2, TKey3>(Expression<Func<T, TKey1>> keySelector1,
          Expression<Func<T, TKey2>> keySelector2,
          Expression<Func<T, TKey3>> keySelector3)
     {
          _queryable = _queryable
               .OrderBy(keySelector1)
               .OrderBy(keySelector2)
               .OrderBy(keySelector3);
          return this;
     }

     public Orderable<T> Desc<TKey>(Expression<Func<T, TKey>> keySelector)
     {
          _queryable = _queryable
               .OrderByDescending(keySelector);
          return this;
     }

     public Orderable<T> Desc<TKey1, TKey2>(Expression<Func<T, TKey1>> keySelector1,
          Expression<Func<T, TKey2>> keySelector2)
     {
          _queryable = _queryable
               .OrderByDescending(keySelector1)
               .OrderByDescending(keySelector2);
          return this;
     }

     public Orderable<T> Desc<TKey1, TKey2, TKey3>(Expression<Func<T, TKey1>> keySelector1,
          Expression<Func<T, TKey2>> keySelector2,
          Expression<Func<T, TKey3>> keySelector3)
     {
          _queryable = _queryable
               .OrderByDescending(keySelector1)
               .OrderByDescending(keySelector2)
               .OrderByDescending(keySelector3);
          return this;
     }
}

因此,它的使用方式如下:

var foos = _fooRepos.Fetch(
     f => f.Name == "two" || f.Name == "three",
     o => o.Asc(f => f.Name, f => f.Id)
);

这是实现我想要实现的目标的最佳方式吗?我试图让它尽可能简单。如果有任何示例代码和文章,我将不胜感激。

最佳答案

我确信 Orchard 的人有他们的理由(没有查看代码库),但我只是想知道与更“标准”的基于 LINQ/IQueryable 的解决方案相比,它带来了什么?

public interface IRepository<T>  
{  
    IQueryable<T> All(); 
} 

用法:

var foos = from f in _foosRepos.All()
           where f.Name == "two" || f.Name == "three"
           orderby f.Name, f.Id;

var foos = _foosRepos.All()
        .Where(f => f.Name == "two" || f.Name == "three")
        .OrderBy(f => f.Name).ThenBy(f => f.Id);

关于c# - 首先使用实体​​框架代码为存储库实现通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8239445/

相关文章:

c# - 如何计算字典中唯一值的出现次数?

c# - 如何在公共(public)访问设置为 'Private' 的容器中复制 blob?

java - RSA加密中的 "A device attached to the system is not functioning"错误是什么?

c# - 动态 LINQ 日期时间比较字符串构建 - Linq To Entities

sql-server - 在中间层使用 Entity Framework 时,我们应该如何捕获数据库用户?

asp.net - 图像文件正在被另一个进程使用

c# - Visual Studio 2010 (C#) 中 ReportDocument 的 SetDataSource 错误

c# - 如何在项目中包含本地化的 jquery datepicker

c# - Entity Framework 5.0 - 1 对 1 关系无故为 NULL

c#-4.0 - 使用 Moq 模拟存储库时出现问题