Tôi đang chạy vào một vấn đề với pseudoquery sau:Hai LINQ truy vấn tương tự, hoàn toàn khác nhau tạo ra SQL
var daily = from p in db.table1
group p by new
{
key1,
key2
} into g
join d in db.table2
on new { p.key1, p.key2 } equals { d.key1, d.key2 }
select new
{
col1 = g.Key.key1
col2 = g.Sum(a => a.column2)
col3 = d.column3
};
Nó chạy nhưng câu lệnh SQL được tạo ra mà LINQ gửi đến SQL Server là ngớ ngẩn. Việc triển khai thực tế sau một thiết lập tương tự như trên với 7 hoặc nhiều cột hơn mà mỗi cột có một phép tính .Sum(). SQL được tạo ra có khoảng 10-11 câu lệnh SELECT lồng nhau không có INNER JOIN và, tất nhiên, chạy mãi mãi.
Tôi đã thử nghiệm ra một thực hiện truy vấn:
var daily = from p in
(from p in db.table1
group p by new
{
key1,
key2
} into g
select new
{
col1 = g.Key.key1,
col2 = g.Sum(a => a.column2)
})
join d in db.table2
on new { p.key1, p.key2 } equals new { d.key1, d.key2 }
select new
{
col1 = p.col1,
col2 = p.col2,
col3 = d.column3
};
Phiên bản này tạo ra SQL xa hợp lý hơn với một đơn SUB-SELECT và một INNER JOIN statement (nó cũng chạy damn gần ngay lập tức). Điều tôi ghét về điều này là truy vấn LINQ đầu tiên, IMHO, xa hơn về phía trước và ngắn gọn trong khi thứ hai có vẻ khá dư thừa kể từ khi tôi phải xác định tất cả các cột tôi muốn từ table1 hai lần.
Tại sao hai truy vấn tương tự này thực hiện quá khác nhau trên máy chủ và tại sao truy vấn 2 kết thúc hiệu quả hơn rất nhiều ngay cả khi mã của nó kém rõ ràng hơn?
Có cách nào để tôi có thể viết lại truy vấn đầu tiên hiệu quả như lần thứ hai không?
Bạn có thể đăng SQL của cả hai phiên bản không? – usr
@usr Chắc chắn, hãy để tôi cố gắng để làm sạch nó lên một chút đầu tiên như tôi đã làm cho các truy vấn LINQ. – Kittoes0124
@Kittoes Bạn có thể sử dụng [** LinqPad **] (http://www.linqpad.net/) để viết LINQ và lấy mã Lambda và SQL – balexandre