aşağıdaki pseudoquery bir sorun haline çalıştırıyorum:iki benzer LINQ sorguları, bambaşka oluşturulan 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
};
O çalıştırır ama LINQ SQL Server gönderdiği oluşturulan SQL deyimi saçma olduğunu. Gerçek uygulama, her biri bir .Sum() hesaplaması olan 7 veya daha fazla sütunla yukarıdaki gibi benzer bir kurulum izler. Oluşturulan SQL, INNER JOIN olmadan 10-11 iç içe geçmiş SELECT deyimleri etrafında bir yere sahip ve tabii ki, sonsuza kadar sürecek.
Ben sorgunun başka uygulama dışarı test:
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
};
Bu sürüm, tek JOIN ALT SEÇ ve bir INNER deyimi ile çok daha makul SQL oluşturur (aynı zamanda yakın anında lanet çalışır). Bundan nefret ettiğim şey, ilk LINQ sorgusudur, IMHO, çok daha düz ve özlü iken, ikincisi ise tablo1'den iki kez istediğim tüm sütunları tanımlamak zorunda kaldığım için gereksizdir.
Bu iki benzer sorgu, sunucuda neden bu kadar farklı performans gösteriyor ve neden kod 2 çok daha az anlamlı olsa da, sorgu 2 neden çok daha verimli oluyor?
İlk sorguyu ikinci kadar verimli olarak yeniden yazmanın bir yolu var mı?
Her iki sürümde SQL'i yükleyebilir misiniz? – usr
@usr Sure, LINQ sorguları için yaptığım gibi ilk önce temizlemeyi deneyeyim. – Kittoes0124
@Kittoes Linq yazmak ve Lambda ve SQL kodunu almak için [** LinqPad **] (http://www.linqpad.net/) kullanabilirsiniz – balexandre