在我的项目中有大约10个基本模型,还有一些是相互继承的。除其他外,我还有文件、用户、组,它们都有与组相关的ReadAccess和WriteAccess。都是从档案里继承的。文件还具有一个地址字符串属性。
我有一个LINQ查询,它是由返回表达式树的几个助手函数生成的。返回的表达式树之一基本上是
dbContext.Files.Where(f => f.Address == "somepath" && (f.ReadAccess == null || [4].Contains(f.ReadAccess.Id) || f.WriteAccess == null || [4].Contains(f.WriteAccess)).ToList()这将生成一个巨大的SQL查询。我想知道作为varchar/varbinary的所有NULL是什么,为什么在每个文件类型都在同一个表中时会生成这个值呢?它似乎相当丰富。它是减慢了SQL查询的执行速度,还是被SQL解析器优化了?在将表达式树生成到LINQ时是否存在任何缺陷?为什么当文件夹不从File继承而我只要求文件时,SQL查询会为文件夹生成案例?
使用最新的EF (6.1)。
Alumis_SELECT
[Filter1].[Id1] AS [Id],
CASE WHEN ([Filter1].[Discriminator1] = N'Group') THEN '0X0X0X' WHEN ([Filter1].[Discriminator1] = N'User') THEN '0X0X1X' WHEN ([Filter1].[Discriminator1] = N'Article') THEN '0X0X2X' WHEN ([Filter1].[Discriminator1] = N'Folder') THEN '0X1X' WHEN ([Filter1].[Discriminator1] = N'Blob') THEN '0X0X3X' WHEN ([Filter1].[Discriminator1] = N'Image') THEN '0X0X3X0X' WHEN ([Filter1].[Discriminator1] = N'Role') THEN '0X0X4X' WHEN ([Filter1].[Discriminator1] = N'ScheduledIndexTask') THEN '0X0X5X0X' WHEN ([Filter1].[Discriminator1] = N'Website') THEN '0X1X0X' ELSE '0X1X0X0X' END AS [C1],
[Filter1].[Name1] AS [Name],
[Filter1].[Modified1] AS [Modified],
[Filter1].[IsDeleted1] AS [IsDeleted],
[Filter1].[Address1] AS [Address],
[Filter1].[SortOrder1] AS [SortOrder],
CASE WHEN ([Filter1].[Discriminator1] = N'Group') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'User') THEN [Filter1].[GivenName1] WHEN ([Filter1].[Discriminator1] = N'Article') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Folder') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Blob') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Image') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Role') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'ScheduledIndexTask') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Website') THEN CAST(NULL AS varchar(1)) END AS [C2],
CASE WHEN ([Filter1].[Discriminator1] = N'Group') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'User') THEN [Filter1].[Surname1] WHEN ([Filter1].[Discriminator1] = N'Article') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Folder') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Blob') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Image') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Role') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'ScheduledIndexTask') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Website') THEN CAST(NULL AS varchar(1)) END AS [C3],
CASE WHEN ([Filter1].[Discriminator1] = N'Group') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'User') THEN [Filter1].[EmailAddress1] WHEN ([Filter1].[Discriminator1] = N'Article') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Folder') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Blob') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Image') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Role') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'ScheduledIndexTask') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Website') THEN CAST(NULL AS varchar(1)) END AS [C4],
CASE WHEN ([Filter1].[Discriminator1] = N'Group') THEN CAST(NULL AS varbinary(1)) WHEN ([Filter1].[Discriminator1] = N'User') THEN CASE WHEN ([Filter1].[Discriminator1] = N'User') THEN [Filter1].[Password_Salt1] END WHEN ([Filter1].[Discriminator1] = N'Article') THEN CAST(NULL AS varbinary(1)) WHEN ([Filter1].[Discriminator1] = N'Folder') THEN CAST(NULL AS varbinary(1)) WHEN ([Filter1].[Discriminator1] = N'Blob') THEN CAST(NULL AS varbinary(1)) WHEN ([Filter1].[Discriminator1] = N'Image') THEN CAST(NULL AS varbinary(1)) WHEN ([Filter1].[Discriminator1] = N'Role') THEN CAST(NULL AS varbinary(1)) WHEN ([Filter1].[Discriminator1] = N'ScheduledIndexTask') THEN CAST(NULL AS varbinary(1)) WHEN ([Filter1].[Discriminator1] = N'Website') THEN CAST(NULL AS varbinary(1)) END AS [C5],
CASE WHEN ([Filter1].[Discriminator1] = N'Group') THEN CAST(NULL AS varbinary(1)) WHEN ([Filter1].[Discriminator1] = N'User') THEN CASE WHEN ([Filter1].[Discriminator1] = N'User') THEN [Filter1].[Password_Hash1] END WHEN ([Filter1].[Discriminator1] = N'Article') THEN CAST(NULL AS varbinary(1)) WHEN ([Filter1].[Discriminator1] = N'Folder') THEN CAST(NULL AS varbinary(1)) WHEN ([Filter1].[Discriminator1] = N'Blob') THEN CAST(NULL AS varbinary(1)) WHEN ([Filter1].[Discriminator1] = N'Image') THEN CAST(NULL AS varbinary(1)) WHEN ([Filter1].[Discriminator1] = N'Role') THEN CAST(NULL AS varbinary(1)) WHEN ([Filter1].[Discriminator1] = N'ScheduledIndexTask') THEN CAST(NULL AS varbinary(1)) WHEN ([Filter1].[Discriminator1] = N'Website') THEN CAST(NULL AS varbinary(1)) END AS [C6],
CASE WHEN ([Filter1].[Discriminator1] = N'Group') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'User') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Article') THEN [Filter1].[Headline1] WHEN ([Filter1].[Discriminator1] = N'Folder') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Blob') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Image') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Role') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'ScheduledIndexTask') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Website') THEN CAST(NULL AS varchar(1)) END AS [C7],
CASE WHEN ([Filter1].[Discriminator1] = N'Group') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'User') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Article') THEN [Filter1].[Lead1] WHEN ([Filter1].[Discriminator1] = N'Folder') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Blob') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Image') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Role') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'ScheduledIndexTask') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Website') THEN CAST(NULL AS varchar(1)) END AS [C8],
CASE WHEN ([Filter1].[Discriminator1] = N'Group') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'User') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Article') THEN [Filter1].[Body1] WHEN ([Filter1].[Discriminator1] = N'Folder') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Blob') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Image') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Role') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'ScheduledIndexTask') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Website') THEN CAST(NULL AS varchar(1)) END AS [C9],
CASE WHEN ([Filter1].[Discriminator1] = N'Group') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'User') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'Article') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'Folder') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'Blob') THEN [Filter1].[ProviderType1] WHEN ([Filter1].[Discriminator1] = N'Image') THEN [Filter1].[ProviderType1] WHEN ([Filter1].[Discriminator1] = N'Role') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'ScheduledIndexTask') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'Website') THEN CAST(NULL AS int) END AS [C10],
CASE WHEN ([Filter1].[Discriminator1] = N'Group') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'User') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Article') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Folder') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Blob') THEN [Filter1].[ProviderData1] WHEN ([Filter1].[Discriminator1] = N'Image') THEN [Filter1].[ProviderData1] WHEN ([Filter1].[Discriminator1] = N'Role') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'ScheduledIndexTask') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Website') THEN CAST(NULL AS varchar(1)) END AS [C11],
CASE WHEN ([Filter1].[Discriminator1] = N'Group') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'User') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Article') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Folder') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Blob') THEN [Filter1].[ContentType1] WHEN ([Filter1].[Discriminator1] = N'Image') THEN [Filter1].[ContentType1] WHEN ([Filter1].[Discriminator1] = N'Role') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'ScheduledIndexTask') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Website') THEN CAST(NULL AS varchar(1)) END AS [C12],
CASE WHEN ([Filter1].[Discriminator1] = N'Group') THEN CAST(NULL AS bigint) WHEN ([Filter1].[Discriminator1] = N'User') THEN CAST(NULL AS bigint) WHEN ([Filter1].[Discriminator1] = N'Article') THEN CAST(NULL AS bigint) WHEN ([Filter1].[Discriminator1] = N'Folder') THEN CAST(NULL AS bigint) WHEN ([Filter1].[Discriminator1] = N'Blob') THEN [Filter1].[Size1] WHEN ([Filter1].[Discriminator1] = N'Image') THEN [Filter1].[Size1] WHEN ([Filter1].[Discriminator1] = N'Role') THEN CAST(NULL AS bigint) WHEN ([Filter1].[Discriminator1] = N'ScheduledIndexTask') THEN CAST(NULL AS bigint) WHEN ([Filter1].[Discriminator1] = N'Website') THEN CAST(NULL AS bigint) END AS [C13],
CASE WHEN ([Filter1].[Discriminator1] = N'Group') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'User') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'Article') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'Folder') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'Blob') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'Image') THEN [Filter1].[Width1] WHEN ([Filter1].[Discriminator1] = N'Role') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'ScheduledIndexTask') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'Website') THEN CAST(NULL AS int) END AS [C14],
CASE WHEN ([Filter1].[Discriminator1] = N'Group') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'User') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'Article') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'Folder') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'Blob') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'Image') THEN [Filter1].[Height1] WHEN ([Filter1].[Discriminator1] = N'Role') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'ScheduledIndexTask') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'Website') THEN CAST(NULL AS int) END AS [C15],
CASE WHEN ([Filter1].[Discriminator1] = N'Group') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'User') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Article') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Folder') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Blob') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Image') THEN [Filter1].[FocalPoints1] WHEN ([Filter1].[Discriminator1] = N'Role') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'ScheduledIndexTask') THEN CAST(NULL AS varchar(1)) WHEN ([Filter1].[Discriminator1] = N'Website') THEN CAST(NULL AS varchar(1)) END AS [C16],
CASE WHEN ([Filter1].[Discriminator1] = N'Group') THEN CAST(NULL AS bit) WHEN ([Filter1].[Discriminator1] = N'User') THEN CAST(NULL AS bit) WHEN ([Filter1].[Discriminator1] = N'Article') THEN CAST(NULL AS bit) WHEN ([Filter1].[Discriminator1] = N'Folder') THEN CAST(NULL AS bit) WHEN ([Filter1].[Discriminator1] = N'Blob') THEN CAST(NULL AS bit) WHEN ([Filter1].[Discriminator1] = N'Image') THEN CAST(NULL AS bit) WHEN ([Filter1].[Discriminator1] = N'Role') THEN CAST(NULL AS bit) WHEN ([Filter1].[Discriminator1] = N'ScheduledIndexTask') THEN [Filter1].[IsEnabled1] WHEN ([Filter1].[Discriminator1] = N'Website') THEN CAST(NULL AS bit) END AS [C17],
CASE WHEN ([Filter1].[Discriminator1] = N'Group') THEN CAST(NULL AS time) WHEN ([Filter1].[Discriminator1] = N'User') THEN CAST(NULL AS time) WHEN ([Filter1].[Discriminator1] = N'Article') THEN CAST(NULL AS time) WHEN ([Filter1].[Discriminator1] = N'Folder') THEN CAST(NULL AS time) WHEN ([Filter1].[Discriminator1] = N'Blob') THEN CAST(NULL AS time) WHEN ([Filter1].[Discriminator1] = N'Image') THEN CAST(NULL AS time) WHEN ([Filter1].[Discriminator1] = N'Role') THEN CAST(NULL AS time) WHEN ([Filter1].[Discriminator1] = N'ScheduledIndexTask') THEN [Filter1].[Interval1] WHEN ([Filter1].[Discriminator1] = N'Website') THEN CAST(NULL AS time) END AS [C18],
CASE WHEN ([Filter1].[Discriminator1] = N'Group') THEN CAST(NULL AS datetimeoffset) WHEN ([Filter1].[Discriminator1] = N'User') THEN CAST(NULL AS datetimeoffset) WHEN ([Filter1].[Discriminator1] = N'Article') THEN CAST(NULL AS datetimeoffset) WHEN ([Filter1].[Discriminator1] = N'Folder') THEN CAST(NULL AS datetimeoffset) WHEN ([Filter1].[Discriminator1] = N'Blob') THEN CAST(NULL AS datetimeoffset) WHEN ([Filter1].[Discriminator1] = N'Image') THEN CAST(NULL AS datetimeoffset) WHEN ([Filter1].[Discriminator1] = N'Role') THEN CAST(NULL AS datetimeoffset) WHEN ([Filter1].[Discriminator1] = N'ScheduledIndexTask') THEN [Filter1].[NextScheduledTime1] WHEN ([Filter1].[Discriminator1] = N'Website') THEN CAST(NULL AS datetimeoffset) END AS [C19],
CASE WHEN ([Filter1].[Discriminator1] = N'Group') THEN CAST(NULL AS datetimeoffset) WHEN ([Filter1].[Discriminator1] = N'User') THEN CAST(NULL AS datetimeoffset) WHEN ([Filter1].[Discriminator1] = N'Article') THEN CAST(NULL AS datetimeoffset) WHEN ([Filter1].[Discriminator1] = N'Folder') THEN CAST(NULL AS datetimeoffset) WHEN ([Filter1].[Discriminator1] = N'Blob') THEN CAST(NULL AS datetimeoffset) WHEN ([Filter1].[Discriminator1] = N'Image') THEN CAST(NULL AS datetimeoffset) WHEN ([Filter1].[Discriminator1] = N'Role') THEN CAST(NULL AS datetimeoffset) WHEN ([Filter1].[Discriminator1] = N'ScheduledIndexTask') THEN [Filter1].[LastStarted1] WHEN ([Filter1].[Discriminator1] = N'Website') THEN CAST(NULL AS datetimeoffset) END AS [C20],
CASE WHEN ([Filter1].[Discriminator1] = N'Group') THEN CAST(NULL AS datetimeoffset) WHEN ([Filter1].[Discriminator1] = N'User') THEN CAST(NULL AS datetimeoffset) WHEN ([Filter1].[Discriminator1] = N'Article') THEN CAST(NULL AS datetimeoffset) WHEN ([Filter1].[Discriminator1] = N'Folder') THEN CAST(NULL AS datetimeoffset) WHEN ([Filter1].[Discriminator1] = N'Blob') THEN CAST(NULL AS datetimeoffset) WHEN ([Filter1].[Discriminator1] = N'Image') THEN CAST(NULL AS datetimeoffset) WHEN ([Filter1].[Discriminator1] = N'Role') THEN CAST(NULL AS datetimeoffset) WHEN ([Filter1].[Discriminator1] = N'ScheduledIndexTask') THEN [Filter1].[LastCompleted1] WHEN ([Filter1].[Discriminator1] = N'Website') THEN CAST(NULL AS datetimeoffset) END AS [C21],
CASE WHEN ([Filter1].[Discriminator1] = N'Group') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'User') THEN [Filter1].[Id2] WHEN ([Filter1].[Discriminator1] = N'Article') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'Folder') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'Blob') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'Image') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'Role') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'ScheduledIndexTask') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'Website') THEN CAST(NULL AS int) END AS [C22],
CASE WHEN ([Filter1].[Discriminator1] = N'Group') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'User') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'Article') THEN [Filter1].[Author_Id1] WHEN ([Filter1].[Discriminator1] = N'Folder') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'Blob') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'Image') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'Role') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'ScheduledIndexTask') THEN CAST(NULL AS int) WHEN ([Filter1].[Discriminator1] = N'Website') THEN CAST(NULL AS int) END AS [C23],
[Filter1].[Language_Id1] AS [Language_Id],
[Filter1].[ParentFolder_Id1] AS [ParentFolder_Id],
[Filter1].[ReadAccess_Id1] AS [ReadAccess_Id],
[Filter1].[WriteAccess_Id1] AS [WriteAccess_Id]
FROM (SELECT [Extent1].[Id] AS [Id1], [Extent1].[Name] AS [Name1], [Extent1].[Modified] AS [Modified1], [Extent1].[IsDeleted] AS [IsDeleted1], [Extent1].[Address] AS [Address1], [Extent1].[SortOrder] AS [SortOrder1], [Extent1].[GivenName] AS [GivenName1], [Extent1].[Surname] AS [Surname1], [Extent1].[EmailAddress] AS [EmailAddress1], [Extent1].[Password_Salt] AS [Password_Salt1], [Extent1].[Password_Hash] AS [Password_Hash1], [Extent1].[Headline] AS [Headline1], [Extent1].[Lead] AS [Lead1], [Extent1].[Body] AS [Body1], [Extent1].[ProviderType] AS [ProviderType1], [Extent1].[ProviderData] AS [ProviderData1], [Extent1].[ContentType] AS [ContentType1], [Extent1].[Size] AS [Size1], [Extent1].[Width] AS [Width1], [Extent1].[Height] AS [Height1], [Extent1].[FocalPoints] AS [FocalPoints1], [Extent1].[IsEnabled] AS [IsEnabled1], [Extent1].[Interval] AS [Interval1], [Extent1].[NextScheduledTime] AS [NextScheduledTime1], [Extent1].[LastStarted] AS [LastStarted1], [Extent1].[LastCompleted] AS [LastCompleted1], [Extent1].[Discriminator] AS [Discriminator1], [Extent1].[Author_Id] AS [Author_Id1], [Extent1].[Language_Id] AS [Language_Id1], [Extent1].[ParentFolder_Id] AS [ParentFolder_Id1], [Extent1].[ReadAccess_Id] AS [ReadAccess_Id1], [Extent1].[WriteAccess_Id] AS [WriteAccess_Id1], [Extent2].[Id] AS [Id2], [Extent3].[Id] AS [Id3]
FROM [dbo].[FilesAndFolders] AS [Extent1]
LEFT OUTER JOIN [dbo].[FilesAndFolders] AS [Extent2] ON ([Extent2].[Author_Id] IS NOT NULL) AND ([Extent1].[Id] = [Extent2].[Author_Id])
LEFT OUTER JOIN [dbo].[FilesAndFolders] AS [Extent3] ON ([Extent3].[Discriminator] IN (N'Group',N'User')) AND ((CASE WHEN ([Extent3].[Discriminator] = N'Group') THEN cast(1 as bit) ELSE cast(0 as bit) END) = 1) AND ([Extent1].[ReadAccess_Id] = [Extent3].[Id])
WHERE ([Extent1].[Discriminator] IN (N'Group',N'User',N'Article',N'Folder',N'Blob',N'Image',N'Role',N'ScheduledIndexTask',N'Website',N'Intranet')) AND (CASE WHEN ([Extent1].[Discriminator] = N'Group') THEN '0X0X0X' WHEN ([Extent1].[Discriminator] = N'User') THEN '0X0X1X' WHEN ([Extent1].[Discriminator] = N'Article') THEN '0X0X2X' WHEN ([Extent1].[Discriminator] = N'Folder') THEN '0X1X' WHEN ([Extent1].[Discriminator] = N'Blob') THEN '0X0X3X' WHEN ([Extent1].[Discriminator] = N'Image') THEN '0X0X3X0X' WHEN ([Extent1].[Discriminator] = N'Role') THEN '0X0X4X' WHEN ([Extent1].[Discriminator] = N'ScheduledIndexTask') THEN '0X0X5X0X' WHEN ([Extent1].[Discriminator] = N'Website') THEN '0X1X0X' ELSE '0X1X0X0X' END LIKE '0X0X%') ) AS [Filter1]
LEFT OUTER JOIN [dbo].[FilesAndFolders] AS [Extent4] ON ([Extent4].[Discriminator] IN (N'Group',N'User')) AND ((CASE WHEN ([Extent4].[Discriminator] = N'Group') THEN cast(1 as bit) ELSE cast(0 as bit) END) = 1) AND ([Filter1].[WriteAccess_Id1] = [Extent4].[Id])
WHERE (([Filter1].[Address1] = @p__linq__0) OR (([Filter1].[Address1] IS NULL) AND (@p__linq__0 IS NULL))) AND (([Filter1].[Id3] IS NULL) OR ([Extent4].[Id] IS NULL) OR (([Filter1].[ReadAccess_Id1] IN (4)) AND ([Filter1].[ReadAccess_Id1] IS NOT NULL)) OR (([Filter1].[WriteAccess_Id1] IN (4)) AND ([Filter1].[WriteAccess_Id1] IS NOT NULL)))_p__linq__0=/artikkel-test发布于 2014-11-07 19:17:20
我想知道作为varchar/varbinary的所有NULL是什么,为什么在每个文件类型都在同一个表中时会生成这个值呢?
看起来您正在使用Code方法,在解决方案中使用默认的表-每个层次结构(TPH)映射策略。对于TPH,会为类的层次结构创建一个大表(在您的例子中,是File &后代)。所有非主键列都是可空的,因为此表包含不同类型的对象(例如,User有一个强制的GivenName属性,但Group没有。因为User和Group对象存储在同一个表中,所以GivenName对于用户应该是非null,对于组是null )。这就解释了为什么SQL查询有那么多空检查和强制转换。
为什么当文件夹不从File继承而我只要求文件时,SQL查询会为文件夹生成案例?
File和Folder类似乎相互依赖(也就是说,File具有Folder类型的属性)。在这种情况下,请确保您有偷懒装货。的所有先决条件。
通常,我强烈建议如果您有一个具有多种类型和深度继承的类的庞大层次结构,则强烈建议避免使用EF。这种情况下的表现非常非常糟糕。
如果您别无选择,只能使用EF,则仍然可以提高查询的性能。让我们假设您只需要查询中的文件名。在这种情况下,而不是这样:
from f in dbContext.Files
where f.Address == "somepath"
select f你可以用这个:
from f in dbContext.Files
where f.Address == "somepath"
select new { f.Name }这将大大降低生成的SQL查询的复杂性。
https://stackoverflow.com/questions/26788601
复制相似问题