何时为服务创建方法?

时间:2017-04-26 01:24:02

标签: c# entity-framework

假设我有一个名为BookService的服务,我有一个名为GetAllBooksGetBookById的方法,依此类推。现在我想获得最近修改过的所有书籍,所以我需要另一种方法吗?或者我应该使用GetAllBooks().Where(....)

在下面的代码中,GetBooksByAuthorAGetBooksByAuthorB之间是否存在差异?

public List<Book> GetAllBooks()
{
   return _context.Books.ToList();
}

public List<Book> GetBooksByAuthorA(string author)
{
   return _context.Books.Where(a => a.Author == author);
}

public List<Book> GetBooksByAuthorB(string author)
{
   return GetAllBooks().Where(a => a.Author == author);
}

PS:上面的代码没有经过测试,我只是把它作为我想告诉的一个例子。

2 个答案:

答案 0 :(得分:0)

创建另一种方法,将结果过滤为您感兴趣的记录。

调用ToList()后,将执行您正在构建的查询,并返回所有匹配的记录。因此,如果您只对一部分图书感兴趣,那么您肯定不想致电GetAllBooks()

public List<Book> GetBooksByAuthorA(DateTime modifiedDate)
{
  return _context.Books.Where(a => a.ModifiedDate > modifiedDate).ToList();
}

另一个考虑因素。除非您在所有地方调用这些方法,否则我不确定您是否需要为每个查询创建单独的方法。

在您的程序中您决定在特定日期之后需要特定作者的书籍列表时,只需创建一个新的上下文并定义您的查询。

List<Book> books;
using (var context = new YourDbContext())
{
  books = context.Books.Where(a => a.Author == author && a.ModifiedDate > modDate).ToList();
}

答案 1 :(得分:0)

正如@Rob所说,区别在于_context.Books是IQueryable,意味着过滤器将在数据库上运行。 GetBooksByAuthorB将从数据库加载每本书,然后在内存中过滤

如果要从远程数据库获取记录,则应使用IQueryable。它使用表达式树构造查询。另一方面,在IEnumerable中,查询是使用委托构建的。

摘要:GetBooksByAuthorA是您的最佳选择。