from子句中的嵌套查询

时间:2010-08-10 13:42:20

标签: linq nested

我写了这个LINQ代码:

from workTask in VwWorkTask.Where(e => e.TaskStateStr != "A" 
                                    && e.TaskStateStr != "B")
join workContext in TblWorkTOBProlongationWorkContexts 
        on workTask.WorkContextId equals workContext.Id  
join client in VwClient 
        on workContext.Client equals client.ClientId  into t1
from client in t1.DefaultIfEmpty()
....// other joins
select workTask

生成此T-SQL查询:

SELECT [t0].*
FROM [vwWorkTask] AS [t0]
INNER JOIN [tblWorkTOBProlongationWorkContext] AS [t1] 
        ON [t0].[WorkContextId] = ([t1].[Id])
LEFT OUTER JOIN [vwClient] AS [t2] ON [t1].[Client] = [t2].[ClientId]
... -- other joins
WHERE ([t0].[TaskStateStr] <> @p0) AND ([t0].[TaskStateStr] <> @p1)

但我需要这样的东西:

SELECT [t0].*
FROM [select * vwWorkTask WHERE ([t0].[TaskStateStr] <> @p0) 
                          AND ([t0].[TaskStateStr] <> @p1)] AS [t0]
INNER JOIN [tblWorkTOBProlongationWorkContext] AS [t1] 
        ON [t0].[WorkContextId] = ([t1].[Id])
LEFT OUTER JOIN [vwClient] AS [t2] ON [t1].[Client] = [t2].[ClientId]
... -- other joins

换句话说,我需要在所有连接之前使用“where”检查嵌套查询,而不是之后。任何想法如何重写LINQ查询来实现这一目标?

感谢。

5 个答案:

答案 0 :(得分:0)

你确定需要吗?

这两个查询实际上应该是一样的。

我认为您担心数据服务器的工作量超出了需求,但您应该相信它知道它在做什么。

答案 1 :(得分:0)

好吧,也许还有其他选择? 也许我必须试着说服我的同事和PM,LINQ2SQL和ORM根本就是 - 我们的项目选择不好而且我们必须在仅使用sql之前重写查询,之后为时已晚?

答案 2 :(得分:0)

  

生成的t-sql查询执行大约18秒,这完全不合适。第二个,“用手”写,最多执行2秒。

向我们展示实际的查询,我们将在第二个允许它使用索引的过程中向您显示过滤的位置。

在那之前,你只是在拖钓。

答案 3 :(得分:0)

  

向我们展示实际查询

原始帖子包含两个查询。你还需要什么?它们几乎相同,除了一个小细节 - 生成的查询在所有加入后应用“where”条件。我相信MSSQL优化器可以t built optimal execution plan because of nested views... But in the other hand I can只是停止使用这些视图,否则负责创建的人就会杀了我。

答案 4 :(得分:0)

如果您对正在生成的TSQL不满意,请考虑将您的确切查询写入存储过程的选项。创建一个新的存储过程,可能名为GetWorkTaskClientSomething。使用所需的适当参数粘贴TSQL调用。

然后,您可以将返回结果集映射到您选择的自定义类。您可以从头开始编写,也可以重用现有的类。

这将允许您根据需要控制TSQL,并允许您继续使用LINQ To SQL提供程序的模型类。

List<foo> = db.GetWorkTaskClientSomething('foo', 'bar', 1);