我注意到今天与实体框架的执行时间存在巨大差异。我想知道为什么第一个语句有这么多开销。对于这个查询,我正在从数据库中检索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);
有人可以澄清两个陈述之间的区别吗?
答案 0 :(得分:1)
答案 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的答案!