优化LINQ to SQL查询

优化LINQ to SQL查询

Optimizing a LINQ to SQL query

我有一个查询,看起来像这样:

1
2
3
4
5
6
7
8
9
10
public IList<Post> FetchLatestOrders(int pageIndex, int recordCount)
{
    DatabaseDataContext db = new DatabaseDataContext();
    return (from o in db.Orders
            orderby o.CreatedDate descending
            select o)
            .Skip(pageIndex * recordCount)
            .Take(recordCount)
            .ToList();
}

我需要打印订单的信息以及创建它的用户:

1
2
3
4
foreach (var o in FetchLatestOrders(0, 10))
{
    Console.WriteLine("{0} {1}", o.Code, o.Customer.Name);
}

这将产生一个SQL查询来带来订单,并为每个订单带来一个查询来带来客户。 是否可以优化查询,以便在一个SQL查询中带来订单及其客户?

谢谢

UDPATE:通过sirrocco的建议,我像这样更改了查询,它可以正常工作。 仅生成一个选择查询:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public IList<Post> FetchLatestOrders(int pageIndex, int recordCount)
{
    var options = new DataLoadOptions();
    options.LoadWith<Post>(o => o.Customer);
    using (var db = new DatabaseDataContext())
    {
        db.LoadOptions = options;
        return (from o in db.Orders
                orderby o.CreatedDate descending
                select o)
                .Skip(pageIndex * recordCount)
                .Take(recordCount)
                .ToList();
    }
}

谢谢你。


您还可以执行其他操作EagerLoading。在Linq2SQL中,您可以使用LoadOptions:有关LoadOptions的更多信息
关于L2S的一个非常奇怪的事情是,您只能在将第一个查询发送到数据库之前设置LoadOptions。


给定一个LINQ语句,例如:

1
2
3
4
5
context.Cars
  .OrderBy(x => x.Id)
  .Skip(50000)
  .Take(1000)
  .ToList();

大致翻译成:

1
select * from [Cars] order by [Cars].[Id] asc offset 50000 rows fetch next 1000 rows

由于offset和fetch是order by的扩展,因此只有在select-portion运行之后才执行它们(google)。这意味着在获取获取结果之前,会对整个数据集([Cars])执行带有很多连接语句的昂贵选择。

优化陈述
所需要做的只是获取OrderBy,Skip和Take语句,并将它们放入Where子句中:

1
2
3
context.Cars
  .Where(x => context.Cars.OrderBy(y => y.Id).Select(y => y.Id).Skip(50000).Take(1000).Contains(x.Id))
  .ToList();

大致翻译成:

1
2
3
4
5
6
7
8
9
exec sp_executesql N'
select * from [Cars]
where exists
  (select 1 from
    (select [Cars].[Id] from [Cars] order by [Cars].[Id] asc offset @p__linq__0 rows fetch next @p__linq__1 rows only
    ) as [Limit1]
    where [Limit1].[Id] = [Cars].[Id]
  )
order by [Cars].[Id] asc',N'@p__linq__0 int,@p__linq__1 int',@p__linq__0=50000,@p__linq__1=1000

因此,现在,外部选择语句仅基于where存在子句在过滤后的数据集上执行!

同样,您的里程可能会因更改而节省多少查询时间。一般的经验法则是,选择语句越复杂,要进入的数据集越深,此优化就越有帮助。


您可能想研究使用编译查询

看看http://www.3devs.com/?p=3


推荐阅读

    linux查询网关命令?

    linux查询网关命令?,网络,信息,地址,环境,系统,网关,名字,中心,状态,命令,lin

    linux命令查询参数?

    linux命令查询参数?,网络,信息,设备,系统,服务,状态,情况,工作,地址,命令,Lin

    linux查询分辨率命令?

    linux查询分辨率命令?,情况,设备,系统,分辨率,数据,命令,屏幕,屏幕分辨率,

    linux常用命令查询?

    linux常用命令查询?,工作,地址,系统,信息,命令,目录,管理,标准,常用命令,控

    linux命令查询汉语?

    linux命令查询汉语?,工作,地址,系统,信息,命令,目录,标准,状态,软件,亚洲,基

    linux下查询历史命令?

    linux下查询历史命令?,地址,信息,系统,服务,数据,连续,命令,数字,名称,环境,l

    linux查询表结构命令?

    linux查询表结构命令?,系统,标准,信息,数据,地址,设备,时间,适当,软件,命令,l

    linux网络命令查询?

    linux网络命令查询?,信息,网络,系统,地址,工作,状态,技术,电脑,命令,设备,lin

    linux查询子目录命令?

    linux查询子目录命令?,信息,系统,命令,名称,文件,名字,管理,软件,灵活,工具,L

    linux查询状态的命令?

    linux查询状态的命令?,系统,状态,信息,管理,数据,情况,命令,综合,电脑,工具,l

    linux地址查询命令?

    linux地址查询命令?,地址,网络,系统,工作,信息,设备,名称,标准,手机,管理,lin

    linux下载gcc命令?

    linux下载gcc命令?,系统,网上,在线,软件,地方,百度,第一,工作,服务,网站,如何

    linux查询id命令?

    linux查询id命令?,信息,系统,密码,地址,用户,命令,数据,术语,用户名,用户信

    命令查询linux版本?

    命令查询linux版本?,系统,信息,名称,状态,电脑,设备,工具,软件,版本,命令,在L

    linux7查询路由命令?

    linux7查询路由命令?,网络,系统,信息,工作,地址,情况,命令,通信,工具,检测,在

    linux查询网卡命令?

    linux查询网卡命令?,地址,系统,网络,信息,电脑,服务,设备,技术指标,命令,状

    linux命令查询词典?

    linux命令查询词典?,地址,工作,标准,信息,系统,命令,管理,目录,单位,数据,lin

    linux隧道查询命令?

    linux隧道查询命令?,工作,系统,地址,信息,时间,网络,命令,检测,设备,目录,lin

    linux命令缩写查询?

    linux命令缩写查询?,工作,系统,地址,信息,管理,命令,软件,设备,目录,基础,lin