我正在使用 Entity Framework 4.1
和 repository 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/