2017-04-26 52 views
0

假設我有一個名爲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:上面的代碼沒有經過測試,我只寫它作爲我試圖告訴的一個例子。

+1

'GetBooksByAuthorB'將從數據庫加載每一本書,然後將其過濾到內存中。這是一個糟糕的做法。 – Rob

回答

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(); 
} 
+0

我實際上使用服務和存儲庫。如果我添加一個方法,如'public IQueryable Table(){return _context.Set (); }',然後用它像'書= _bookService.Table(),其中(A => a.Author ==筆者&& a.ModifiedDate>創建ModDate).ToList();'因爲我只把這個查詢一次。 – user3717030

+0

@ user3717030這看起來還好我。我不知道EF那麼好,但只要設置''不會立即返回的所有記錄,那麼它應該被罰款。 –

0

正如@Rob說,所不同的是_context.Books是IQueryable意味着過濾器將運行數據庫上。 GetBooksByAuthorB會從數據庫中加載每本書,然後在內存過濾它

如果您正在從遠程數據庫獲取記錄,則應使用IQueryable。它使用表達式樹構造查詢。另一方面,在IEnumerable中,查詢是使用委託構造的。

摘要:GetBooksByAuthorA是要走的路。

+0

你不加入了那個評論我說...? – Noctis