简体   繁体   English

为什么实体框架使用重复的 SQL 生成嵌套的 SELECT 查询?

[英]Why is Entity Framework producing nested SELECT queries with duplicated SQL?

I'm using Entity Framework logging to look at the SQL generated by my queries.我正在使用实体框架日志记录来查看我的查询生成的 SQL。 In many cases the SQL that's produced has SELECT statements operating on subqueries that are identical to the original query.在许多情况下,生成的 SQL 具有对与原始查询相同的子查询进行操作的 SELECT 语句。 For example:例如:

The following EF code:以下EF代码:

context.PodcastItems
.Where(p => p.ID == sourceFeedUpdateItemId)
.Select(p => new NewPodcastItemSubsetDTO
{
   ID = p.ID,
   ItemID = p.ItemID,
   ItemTitle = p.ItemTitle,
   ItemSummary = p.ItemSummary,
   PermalinkUrl = p.PermalinkUrl,
   ItemPublishedDate = p.ItemPublishedDate,
   AudioFileUrl = p.AudioFileUrl,
   FileSize = p.FileSize,
   Duration = p.Duration
}).SingleOrDefault();

generates the following SQL:生成以下 SQL:

SELECT
    [Limit1].[ID] AS [ID],
    [Limit1].[ItemID] AS [ItemID],
    [Limit1].[ItemTitle] AS [ItemTitle],
    [Limit1].[ItemSummary] AS [ItemSummary],
    [Limit1].[PermalinkUrl] AS [PermalinkUrl],
    [Limit1].[ItemPublishedDate] AS [ItemPublishedDate],
    [Limit1].[AudioFileUrl] AS [AudioFileUrl],
    [Limit1].[FileSize] AS [FileSize],
    [Limit1].[Duration] AS [Duration]
    FROM ( SELECT TOP (2)
        [Extent1].[ID] AS [ID],
        [Extent1].[ItemID] AS [ItemID],
        [Extent1].[ItemTitle] AS [ItemTitle],
        [Extent1].[ItemSummary] AS [ItemSummary],
        [Extent1].[PermalinkUrl] AS [PermalinkUrl],
        [Extent1].[AudioFileUrl] AS [AudioFileUrl],
        [Extent1].[FileSize] AS [FileSize],
        [Extent1].[Duration] AS [Duration],
        [Extent1].[ItemPublishedDate] AS [ItemPublishedDate]
        FROM [dbo].[PodcastItems] AS [Extent1]
        WHERE [Extent1].[ID] = @p__linq__0
    )  AS [Limit1]

and this code:和这个代码:

string content = context.PodcastItems
.Where(p => p.ID == sourceFeedUpdateItemId)
.Select(p => p.ItemContentCleansed)
.SingleOrDefault();

produces:产生:

SELECT
    [Limit1].[ItemContentCleansed] AS [ItemContentCleansed]
    FROM ( SELECT TOP (2)
        [Extent1].[ItemContentCleansed] AS [ItemContentCleansed]
        FROM [dbo].[PodcastItems] AS [Extent1]
        WHERE [Extent1].[ID] = @p__linq__0
    )  AS [Limit1]
SELECT
    [Limit1].[ItemContentCleansed] AS [ItemContentCleansed]
    FROM ( SELECT TOP (2)
        [Extent1].[ItemContentCleansed] AS [ItemContentCleansed]
        FROM [dbo].[PodcastItems] AS [Extent1]
        WHERE [Extent1].[ID] = @p__linq__0
    )  AS [Limit1]
SELECT
    [Limit1].[ItemContentCleansed] AS [ItemContentCleansed]
    FROM ( SELECT TOP (2)
        [Extent1].[ItemContentCleansed] AS [ItemContentCleansed]
        FROM [dbo].[PodcastItems] AS [Extent1]
        WHERE [Extent1].[ID] = @p__linq__0
    )  AS [Limit1]
SELECT
    [Limit1].[ItemContentCleansed] AS [ItemContentCleansed]
    FROM ( SELECT TOP (2)
        [Extent1].[ItemContentCleansed] AS [ItemContentCleansed]
        FROM [dbo].[PodcastItems] AS [Extent1]
        WHERE [Extent1].[ID] = @p__linq__0
    )  AS [Limit1]
SELECT
    [Limit1].[ItemContentCleansed] AS [ItemContentCleansed]
    FROM ( SELECT TOP (2)
        [Extent1].[ItemContentCleansed] AS [ItemContentCleansed]
        FROM [dbo].[PodcastItems] AS [Extent1]
        WHERE [Extent1].[ID] = @p__linq__0
    )  AS [Limit1]

Sure seems like a lot of extra cycles are spent to accomplish...nothing?当然似乎花费了很多额外的周期来完成......什么都没有?

Why might this be happening?为什么会发生这种情况?

Check EDMX file, maybe your entity is defined via DefiningQuery like this:检查 EDMX 文件,也许您的实体是通过DefiningQuery如下所示:

<!-- SSDL content -->
<edmx:StorageModels>
  <Schema Namespace="SchoolModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/11/edm/ssdl">
    <EntityContainer Name="SchoolModelStoreContainer">
       <EntitySet Name="GradeReport" EntityType="SchoolModel.Store.GradeReport">
          <DefiningQuery>
            SELECT CourseID, Grade, FirstName, LastName
            FROM StudentGrade
          </DefiningQuery>
      </EntitySet>

You need to replace it without DefiningQuery with EntitySet only:您只需要使用EntitySet替换它而不需要DefiningQuery

 <EntitySet Name="Course" EntityType="SchoolModel.Store.Course" store:Type="Tables" Schema="dbo" />

Read more in article .文章中阅读更多内容

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM