Linq TO SQL 虽好,但不要滥用

本文通过具体案例展示了如何优化LINQ查询性能,首先介绍了直接在数据库上进行分组查询的方法及存在的问题,随后提出了解决方案:将数据加载到内存后再进行LINQ to Objects处理,有效减轻了数据库的压力。

看看下面的例子。我们的场景是,需要对客户表按照国家进行分组,然后打印出来每个国家的客户数目。

下面的语法看起来很优雅

using System;
using System.Linq;


namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            using (NorthwindDataContext context = new NorthwindDataContext()) {
                context.Log = Console.Out;
                var query = from c in context.Customers
                            group c by c.Country;

                foreach (var item in query)
                {
                    Console.WriteLine(string.Format("国家:{0},客户总数:{1}",item.Key,item.Count()));
                    foreach (var i in item)
                    {
                        Console.WriteLine("\t" + i.CustomerID);
                    }
                }
            }
        }
    }
}

但是,注意观察一下,每循环一个国家的时候,又会发起另外一个查询。这对于数据库服务器而言,是一个不小的压力

image

 

为了做改进,考虑到客户数据本身也不是很多,我们直接将需要的数据先读取到内存中,再用LINQ TO Object的方式对其进行出来岂不是更好

using System;
using System.Linq;


namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            using (NorthwindDataContext context = new NorthwindDataContext()) {
                context.Log = Console.Out;

                var customers = context.Customers.Select(c => new { c.CustomerID, c.Country }).ToArray();
                var query = from c in customers
                            group c by c.Country;

                foreach (var item in query)
                {
                    Console.WriteLine(string.Format("国家:{0},客户总数:{1}", item.Key, item.Count()));
                    foreach (var i in item)
                    {
                        Console.WriteLine("\t" + i.CustomerID);
                    }
                }
            }
        }
    }
}

image

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值