假设我有一个名为BookService的服务,我有一个名为GetAllBooks
,GetBookById
的方法,依此类推。现在我想获得最近修改过的所有书籍,所以我需要另一种方法吗?或者我应该使用GetAllBooks().Where(....)
?
在下面的代码中,GetBooksByAuthorA
和GetBooksByAuthorB
之间是否存在差异?
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:上面的代码没有经过测试,我只是把它作为我想告诉的一个例子。
答案 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是您的最佳选择。