>>747
そう。
Linq文は横に長くなりがちなので、一時変数は極力短くすることが多いのも難しく感じる要因かな。
やってるのはただのinner join

もうちょっと丁寧に書くと
using(var db = new HogeContext() )
{
 // 欲しい情報
 string bookName;
 int bookPrice;
 string categoryName;

 // クエリ生成
 var query = db.Books.Join( db.Categories, outer => outer.category_id, inner => inner.id, ( outer, inner ) => new { Book = outer, Category = inner } );

 // 実際のDB接続とクエリ実行はforeach文に到達したとき
 foreach(var row in query)
 {
  bookName = row.Book.name;
  bookPrice = row.Book.price;
  categoryName = row.Category.name;
  :
  :
 }
}

情報取得だけならAsNoTracking()つけたりするから、さらに横に長くなる。