如何在存储库中创建读取函数?

时间:2013-12-04 13:57:02

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

我正在为基本的CRUD操作创建一个存储库,我有一个关于读取函数的问题。

我读到IQueryable实现了IEnumerable,所以。 我是否可以仅使用IQueryable返回类型创建我的选择函数???

示例:

IQueryable<T> GetQuery() 

IEnumerable<T> GetAll()

或仅查询功能?

IQueryable<T> GetAll()

谢谢!

  • 我正在使用ASP.NET MVC5和EF6:)

1 个答案:

答案 0 :(得分:0)

您可以从Microsoft DynamicQuery类下载,这将对您有所帮助,并使您的工作变得轻松。

http://msdn.microsoft.com/en-US/vstudio/bb964686.aspx

例如

public IEnumerable<T> GetAll<T>()
{
 return this.AddIncludes(this.DbContext.Set<T>()).OrderBy (this.SortSpec.PropertyName).ToList();
}

public IEnumerable<T> Find(Expression<Func<T, bool>> expression)
{
 return this.AddIncludes(this.DbContext.Set<T>()).Where(expression).OrderBy(sortingPropertyName).ToList();
}

阅读此博客:

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

将您的Repository模式与UnitOfWork模式相结合,这将为您提供更好的抽象。

repsoistory接口应仅包含以下重要方法:

public interface IRepository<T> 
{
   List<string> IncludeList { get; } // Include for EF

   IEnumerable<T> GetAll<T>();
   void Delete(T);
   void Add(T);
   IEnumerable<TEntity> Find(Expression<Func<T, bool>> expression);
}

如果你愿意的话,IRepository也可以提供其他方法,如Any,GetRange等。


现在你的Q!

I read that the IQueryable implements the IEnumerable, so. Can i create my select functions using only IQueryable return type or not???

“不同之处在于IQueryable是允许LINQ-to-SQL(LINQ.-to-anything真正)工作的接口。因此,如果您在IQueryable上进一步优化查询,该查询将在数据库中执行,如果可能的话。

对于IEnumerable情况,它将是LINQ-to-object,这意味着必须将与原始查询匹配的所有对象从数据库加载到内存中。 请参阅:Returning IEnumerable<T> vs. IQueryable<T>