2014-11-06 24 views
2

我的項目中有一些〜10個基本模型,並且有些從彼此繼承。 其中我有文件,用戶,組,所有這些都有與組相關的ReadAccess和WriteAccess。全部從File繼承。文件也有一個地址字符串屬性。實體框架龐大的SQL從簡單的LINQ

我有一個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查詢。我想知道什麼所有的NULL作爲varchar/varbinary,爲什麼這是每個單一類型的文件時,他們在同一個表中生成?它似乎相當豐富。它是否會減慢執行中的SQL查詢或被SQL解析器優化掉?將表達式樹生成到LINQ to SQL時是否有任何缺陷?爲什麼當文件夾不能從文件繼承時,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 

回答

0

我想知道什麼所有的NULL爲VARCHAR/VARBINARY和這是爲什麼 生成每一個類型的文件時,他們都在同 表?

看起來您在解決方案中使用Code First方法時使用了默認的按層次結構(TPH)映射策略。在TPH的情況下,爲類的層次結構創建一個大表(在您的情況下,File &後代)。所有非主鍵列都可以爲空,因爲此表包含不同類型的對象(例如,User具有強制的GivenName屬性,但Group沒有。由於UserGroup對象存儲在同一個表中,因此GivenName應該爲非空對於用戶而言爲null)。這就解釋了爲什麼你的SQL查詢有這麼多的空檢查和強制轉換。

爲什麼當文件夾不是 繼承自文件,SQL查詢生成文件夾的情況下,我只要求文件?

好像FileFolder類取決於彼此(即,File具有Folder類型的屬性)。在這種情況下,請確保您具備以下所有必備條件:lazy loading.

通常,如果您擁有龐大的具有多種類型和深層繼承的類的層次結構,我強烈建議避免使用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查詢的複雜性。

+0

請問您可以擴展:「所有非主鍵列都是可空的,因爲這個表包含不同類型的對象(例如,用戶有一個強制的GivenName屬性,但是Group沒有。因爲用戶和組對象被存儲在同一個表中,GivenName對於用戶應該不爲null,對於組爲null)「。基本原理究竟在哪裏?由於文件和文件夾依賴於彼此,它會生成這麼多的SQL?我可以設計一個沒有額外SQL的等價查詢(我可不可以嗎?),那麼爲什麼你要爭辯呢? – HelloWorld 2014-11-10 18:47:39

+0

GivenName根本不是強制性的([必填]) – HelloWorld 2014-11-11 06:34:12