2013-09-26 127 views
1

我想翻譯的查詢是:轉換SQL Server查詢到LINQ

SELECT 
    MIN(BookCopies.id) as id, Books.title, Authors.name, Publishers.name 
FROM 
    dbo.BookCopies 
INNER JOIN 
    Books ON BookCopies.bookId = Books.id 
INNER JOIN 
    Authors ON Books.authorId = Authors.id 
INNER JOIN 
    Publishers ON BookCopies.publisherId = Publishers.id 
WHERE 
    BookCopies.sold = 0 
GROUP BY 
    Books.title, Authors.name, Publishers.name; 

我試圖解決這個問題,3小時,我不能...:/

The Linq code:

var query = (from bc in db.BookCopies 
      join b in db.Books on bc.bookId equals b.id 
      join a in db.Authors on b.authorId equals a.id 
      join p in db.Publishers on bc.publisherId equals p.id 
      where (bc.sold == false && bc.price != null && bc.price != 0) 
      group bc by new {b.title, author = a.name, publisher = p.name} into gr 
      select new {gr.Key.title, gr.Key.author, gr.Key.publisher}); 

但這是不正確的。這裏

+2

在這3個小時內你寫了任何代碼嗎? –

+0

是的,這樣的: 'VAR的查詢=(公元前在db.BookCopies JOIN B在db.Books上bc.bookId等於b.id 在b.authorId db.Authors加入等於a.id 加入p在db.Publishers上bc.publisherId等於p.id 其中(bc.sold == false && bc.price!= null && bc.price!= 0) group bc by new {b.title,a.name}進入gr 選擇新的{bc.id,gr.Key.title,gr.Key.name})。Min();' – zach

回答

2

訣竅是選擇加入到後面將要進行分組的中間數據類型(行)的結果:

from bc in db.BookCopies 
join b in db.Books on bc.bookId equals b.id 
join a in db.Authors on b.authorId equals a.id 
join p in db.Publishers on bc.publisherId equals p.id 
where bc.sold == 0 
select new { bc.id, b.title, author = a.name, publisher = p.name } into row 
group row by new { row.title, row.author, row.publisher } into g 
select new { 
    id = g.Min(x => x.id), 
    g.Key.title, 
    g.Key.author, 
    g.Key.publisher 
} 

這產生你正在尋找的準確相同的查詢。

+1

終於解決了^^非常感謝! – zach