我正在开发一个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秒钟。
查询并不完全相同,但它与我写的几乎相似。
我无法弄清楚为什么要花这么长时间.. 有人可以告诉我为什么要花这么长时间以及我该如何解决它?
答案 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)
};