我写了这个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查询来实现这一目标?
感谢。
答案 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);