【问题标题】:LINQPad - can't understand the query generatedLINQPad - 无法理解生成的查询
【发布时间】:2013-06-06 15:58:29
【问题描述】:

我在 LINQPad 中键入了以下 LINQ,并使用 dbcontext 连接到我的数据库 (SQL Server 2005)。

from j in Jobs
where j.dValuationDate.HasValue && j.dValuationDate.Value > EntityFunctions.AddDays(DateTime.Now, -7).Value &&
j.dValuationDate.Value < EntityFunctions.AddHours(DateTime.Now, -1).Value &&
j.bXMLServiceProviderID.HasValue && j.bXMLServiceProviderID.Value == 1 &&
!ValuationDelays.Any(x => x.iJobID == j.iJobID && x.iStatusID == 5)
select j.iJobID

Jobs 和 ValuationDelays 是我的数据库中由 iJobId 列链接的表。

LINQPad生成的SQL是:

SELECT 
[Extent1].[iDelayID] AS [iDelayID], 
[Extent1].[iJobID] AS [iJobID], 
[Extent1].[sReasonforDelay] AS [sReasonforDelay], 
[Extent1].[dDateTime] AS [dDateTime], 
[Extent1].[iStaffID] AS [iStaffID], 
[Extent1].[iStatusID] AS [iStatusID], 
[Extent1].[dSentDate] AS [dSentDate], 
[Extent1].[yValExDelayReasonID] AS [yValExDelayReasonID], 
[Extent1].[dDelayedUntilDate] AS [dDelayedUntilDate], 
[Extent1].[dValuationDate] AS [dValuationDate], 
[Extent1].[valexActionUpdateId] AS [valexActionUpdateId], 
[Extent1].[valexAppointmentReasonId] AS [valexAppointmentReasonId]
FROM [dbo].[ValuationDelays] AS [Extent1]

注意没有 where 子句。我不明白为什么 LINQPad 会生成这样的查询。我做错了什么?

当我在 VS 2010 中调试时,查询运行良好并在 C# 代码中返回预期结果。

【问题讨论】:

  • select 语句(在 SQL 中)都搞砸了。它应该只选择iJobID...
  • opun 进一步检查,这两个语句根本不匹配。 select错了,From不是同一张表!再次尝试运行 Linq 查询,并确保它更新 SQL 结果

标签: sql sql-server linq entity-framework linqpad


【解决方案1】:

你得到的是!ValuationDelays,而不是!j.ValuationDelays

看起来这会导致 EF 从数据库中加载所有 ValuationDelays 并在内存中处理整个语句。我无法解释为什么没有查询 Job 记录上的谓词,但至少你现在有一些事情要纠正。

【讨论】:

  • ValuationDelays 不是作业表的一部分。就像工作一样,它是一个单独的表。我在这里要做的是写一个 not EXISTS 子句。 italic_not EXISTS(从 iJobID=j.iJobID AND iStatusID=5 的评估延迟中选择 1)_italic
  • 对不起,我明白你在说什么了。我应该通过作业外键(j.ValuationDelays)来引用它,而不是直接引用“ValuationDelays”。我会检查并接受答案或回复。
  • 好的,它的工作方式是这样的。我现在也不需要 x.iJobId == j.iJobId。缩短版为:from j in Jobs where j.dValuationDate.HasValue &amp;&amp; j.dValuationDate.Value &gt; EntityFunctions.AddDays(DateTime.Now, -7).Value &amp;&amp; j.dValuationDate.Value &lt; EntityFunctions.AddHours(DateTime.Now, -1).Value &amp;&amp; j.bXMLServiceProviderID.HasValue &amp;&amp; j.bXMLServiceProviderID.Value == 1 &amp;&amp; !j.ValuationDelays.Any(x =&gt; x.iStatusID == 5) select j.iJobID
猜你喜欢
  • 2015-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多