var q = db.Books.Join( db.Categories, o => o.id, i => i.id, ( o, i ) => new { Book = o, Category = i } );
foreach(var row in q)
{
 int bookId = row.Book.id;
 int categoryId = row.Category.id;
 :
 :
}

まぁ不要なカラムを含んでいる分、使用メモリも増えるが。
生産性優先なら上記のように書くことも多々あり