我在SQL Server 2008上有一张包含150万条记录的表。有一个varchar列'ReferenzNummer'被索引。
SQL Management Studio中执行的以下查询有效并且速度很快:
SELECT v1.Id, v2.Id FROM Vorpapier as v1 cross join Vorpapier as v2
WHERE v1.ReferenzNummer LIKE '7bd48e26-58d9-4c31-a755-a15500bce4c4'
AND v2.ReferenzNummer LIKE '7bd4%'
(我知道这样的查询没有多大意义,会有更多的约束,但这一点并不重要)
现在我想从Entity Framework 5.0执行这样的查询,我的LINQ看起来像这样:
var result = (from v1 in vorpapierRepository.DbSet
from v2 in vorpapierRepository.DbSet
where v1.ReferenzNummer == "7bd48e26-58d9-4c31-a755-a15500bce4c4" &&
v2.ReferenzNummer.StartsWith("7bd4")
select new { V1 = v1.Id, V2 = v2.Id })
.Take(10)
.ToList();
这会尝试将整个表加载到内存中,一段时间后会导致OutOfMemoryException。我试图移动WHERE部分,但没有成功:
var result = (from v1 in vorpapierRepository.DbSet.Where(v => v.ReferenzNummer == "7bd48e26-58d9-4c31-a755-a15500bce4c4")
from v2 in vorpapierRepository.DbSet.Where(v => v.ReferenzNummer.StartsWith("7bd4"))
select new { V1 = v1.Id, V2 = v2.Id })
.Take(10)
.ToList();
是否有可能告诉Entity Framework创建一个交叉连接语句,就像我自己编写的那样?
更新1
EF生成的SQL看起来像这样(对于两个查询)
SELECT [Extent1].[Id] AS [Id],
[Extent1].[VorpapierArtId] AS [VorpapierArtId],
[Extent1].[ReferenzNummer] AS [ReferenzNummer],
[Extent1].[IsImported] AS [IsImported],
[Extent1].[DwhVorpapierId] AS [DwhVorpapierId],
[Extent1].[Datenbasis_Id] AS [Datenbasis_Id]
FROM [dbo].[Vorpapier] AS [Extent1]
更新2
当我更改LINQ查询并将表连接到DatenbasisIDd字段时(这不是我想要的,但它可能有用),EF创建了一个连接:
var result = (from v1 in vorpapierRepository.DbSet
join v2 in vorpapierRepository.DbSet
on v1.DatenbasisId equals v2.DatenbasisId
where v1.ReferenzNummer == "7bd48e26-58d9-4c31-a755-a15500bce4c4" && v2.ReferenzNummer.StartsWith("7bd4")
select new { V1 = v1.Id, V2 = v2.Id })
.Take(10)
.ToList();
生成的SQL查询如下所示。它的工作原理足够快。
SELECT TOP (10) 1 AS [C1],
[Extent1].[Id] AS [Id],
[Extent2].[Id] AS [Id1]
FROM [dbo].[Vorpapier] AS [Extent1]
INNER JOIN [dbo].[Vorpapier] AS [Extent2]
ON ([Extent1].[Datenbasis_Id] = [Extent2].[Datenbasis_Id])
OR (([Extent1].[Datenbasis_Id] IS NULL)
AND ([Extent2].[Datenbasis_Id] IS NULL))
WHERE (N'7bd48e26-58d9-4c31-a755-a15500bce4c4' = [Extent1].[ReferenzNummer])
AND ([Extent2].[ReferenzNummer] LIKE N'7bd4%')
我仍然没有看到,为什么EF不在原始查询中创建交叉连接。它根本不受支持吗?
答案 0 :(得分:0)
如果在linq语句中使用连接,它将被传递回SQL Server。以下是linq中的join运算符的一些示例:http://code.msdn.microsoft.com/LINQ-Join-Operators-dabef4e9