gpt4 book ai didi

左连接上的 Linq-to-SQL 左连接/一个 Linq-to-SQL 语句中的多个左连接

转载 作者:行者123 更新时间:2023-12-01 01:14:14 24 4
gpt4 key购买 nike

我正在尝试将 SQL 过程重写为 Linq,只要它适用于小数据集,一切都很顺利并且工作正常。我在任何地方都找不到答案。问题是,我在查询中有 3 个连接,2 个是 left joins和 1 是 inner join ,它们都相互连接/像一棵树一样。您可以在下面看到 SQL 过程:

SELECT ...
FROM sprawa s (NOLOCK)
LEFT JOIN strona st (NOLOCK) on s.ident = st.id_sprawy
INNER JOIN stan_szczegoly ss (NOLOCK) on s.kod_stanu = ss.kod_stanu
LEFT JOIN broni b (NOLOCK) on b.id_strony = st.ident

我想问你的是一种将其翻译成 Linq 的方法。现在我有这个:
var queryOne = from s in db.sprawa
join st in db.strona on s.ident equals st.id_sprawy into tmp1
from st2 in tmp1.DefaultIfEmpty()
join ss in db.stan_szczegoly on s.kod_stanu equals ss.kod_stanu
join b in db.broni on st2.ident equals b.id_strony into tmp2
from b2 in tmp2.DefaultIfEmpty()
select new { };

看起来不错,但是当使用 SQL Profiler 检查时,发送到数据库的查询如下所示:
SELECT ... FROM    [dbo].[sprawa] AS [Extent1] 
LEFT OUTER JOIN [dbo].[strona] AS [Extent2]
ON [Extent1].[ident] = [Extent2].[id_sprawy]
INNER JOIN [dbo].[stan_szczegoly] AS [Extent3]
ON [Extent1].[kod_stanu] = [Extent3].[kod_stanu]
INNER JOIN [dbo].[broni] AS [Extent4]
ON ([Extent2].[ident] = [Extent4].[id_strony]) OR
(([Extent2].[ident] IS NULL) AND ([Extent4].[id_strony] IS NULL))

正如您所看到的,两个 SQL 查询都有些不同。效果是一样的,但后者的工作速度无比缓慢(不到一秒到超过30分钟)。还有一个 union做了,但应该不是问题。如果被要求,我会为它粘贴代码。

对于如何提高 Linq 语句的性能或如何以正确翻译的方式编写它的任何建议,我将不胜感激。

最佳答案

我想我找到了解决方案:

var queryOne = from s in db.sprawa
join st in db.strona on s.ident equals st.id_sprawy into tmp1
where tmp1.Any()
from st2 in tmp1.DefaultIfEmpty()
join ss in db.stan_szczegoly on s.kod_stanu equals ss.kod_stanu
join b in db.broni on st2.ident equals b.id_strony into tmp2
where tmp2.Any()
from b2 in tmp2.DefaultIfEmpty()
select new { };

换句话说 where table.Any()每个之后 into table陈述。它并没有使翻译变得更好,但将执行时间从近 30 分钟(!)加快到大约 5 秒。

但是必须谨慎使用,因为它可能导致结果集中丢失一些记录。

关于左连接上的 Linq-to-SQL 左连接/一个 Linq-to-SQL 语句中的多个左连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17145640/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com