实体框架执行时间

时间:2013-02-05 11:59:40

标签: c# .net linq frameworks entity

我注意到今天与实体框架的执行时间存在巨大差异。我想知道为什么第一个语句有这么多开销。对于这个查询,我正在从数据库中检索5500个trenddata值(这应该不是什么大问题)。

这是我以前用过的陈述:

TrendDataValues = new ObservableCollection<TrendDataValue>(_trendDataContext.TrendDatas.First(td => td.Id == argument.TrendDataId)
                                                                            .TrendDataValues
                                                                            .Where(tdv => tdv.ValueStartTimestamp >= argument.MinValue
                                                                                       && tdv.ValueStartTimestamp <= argument.MaxValue));

但是,此语句需要 10 秒才能运行。

我已经将第一个语句重写为以下语句。这将检索完全相同的数据。但是,此语句返回 0.2 秒内的值。

 TrendDataValues = new ObservableCollection<TrendDataValue>(from td in _trendDataContext.TrendDatas.Where(d => d.Id == trendDataId)
                                                            from tdv in td.TrendDataValues
                                                            where tdv.ValueStartTimestamp >= argument.MinValue
                                                               && tdv.ValueEndTimestamp <= argument.MaxValue
                                                            select tdv);

有人可以澄清两个陈述之间的区别吗?

3 个答案:

答案 0 :(得分:1)

建议:下载http://www.linqpad.net/

将LINQ-pad连接到您的数据库。

运行这两个查询并查看SQL选项卡,以查看查询生成的SQL是否存在差异。

希望这有帮助!

答案 1 :(得分:1)

链式方法或查询语法如果它们是相同的,结果sql将是相同的,乍一看似乎在第二个例子中你隐式地创建了一个连接,即两个from / where语句将类似于一个内部加入,而在第一个你没有,并且可能正在创建某种形式的笛卡尔积,链式方法将不得不搜索。

正如其他dood建议使用LinqPad并查看生成的sql,我敢打赌它不一样。

P.S。实际上,第二个例子实际上需要更长的时间来编译!但如果两个示例在逻辑上相同,则方法和查询语法将具有相同的执行速度。

答案 2 :(得分:0)

正如上面的答案所述,我已经在linqpad中测试了两个查询。

第一个运行以下查询:

SELECT TOP (1) [t0].[Id], [t0].[Tag], [t0].[Description], [t0].[PollingInterval], [t0].[Compression], [t0].[PlcLogDataTypeValue]
FROM [TrendDatas] AS [t0]
WHERE [t0].[Id] = @p0

第二个运行以下查询:

SELECT [t1].[Id], [t1].[ValueStartTimestamp], [t1].[ValueEndTimestamp], [t1].[Value], [t1].[SerieNumber], [t1].[TrendData_Id]
FROM [TrendDatas] AS [t0], [TrendDataValues] AS [t1]
WHERE ([t1].[ValueStartTimestamp] >= @p0) AND ([t1].[ValueStartTimestamp] <= @p1) AND ([t0].[Id] = @p2) AND ([t1].[TrendData_Id] = [t0].[Id])

显然第一个语句只返回trenddata-parent对象。我猜测它是如何迭代它的值(子元素),因为我没有看到引用TrendDataValues表的查询或连接,但我猜这不会很漂亮。

第二个查询返回一个更好的结果,它与我要求的完全匹配。

感谢您的支持和+1的答案!