LINQ和经典asp的性能差异sql查询

时间:2017-12-23 13:10:06

标签: c# asp.net sql-server linq asp-classic

我正在开发一个asp.net web forms 4.5网站, 我遇到了一个我必须执行SQL查询的问题 来自sql server最初由经典的asp。

编写

原始查询就是这样..

select trait1, trait2, sum(qty) as qty from table2
right outer join table1 on (table1.col == table2.col)
where table2.idx is null 
group by trait1, trait2
order by trait1, trait2

当我正在编写.net程序时,我试图重写此查询... 像这样的事情

var myHashSet = new HashSet<string>(table2.Select(c => c.col));

from item in table2
where !myHashSet.Contains(item.col)
group item.qty by new {item.trait1, item.trait2} into total
select new
{
    trait1 = total.Key.trait1,
    trait2 = total.Key.trait2,
    qty = total.Sum()
} into anon
order by anon.qty descending
select anon

ps:忽略部分顺序..它不重要

对于经典的asp,需要1.5秒,但对于c#asp.net, 大约需要8秒钟。

查询并不完全相同,但它与我写的几乎相似。

我无法弄清楚为什么要花这么长时间.. 有人可以告诉我为什么要花这么长时间以及我该如何解决它?

1 个答案:

答案 0 :(得分:2)

您不需要哈希集,而是使用连接,您的查询可能看起来像

var inner = from two in table2
            join one in table1
                on two.col equals one.col
            group two by new
            {
                two.trait1,
                two.trait2
            } into total
            select new
            {
                total.Key.trait1,
                total.Key.trait2,
                qty = total.Sum(p => p.qty)
            };

修改 为了完整性我还添加了左连接变体

var left = from two in table2
            from one in 
            (
                from temp in table1
                where temp.col == two.col
                select temp
            ).DefaultIfEmpty()
            group two by new
            {
                two.trait1,
                two.trait2
            } into total
            select new
            {
                total.Key.trait1,
                total.Key.trait2,
                qty = total.Sum(p => p.qty)
            };