7

特定のユーザーの個別のキャンペーンを見つける必要があります。ユーザーには CodeRights があり、CodeRights には Codes が含まれ、Codes には Campaign が含まれます。これがCodeRightクラスです

public class SmartCodeRight
{
        [Key, Column(Order = 1)]
        public long UserId { get; set; }
        public virtual User User { get; set; }

        [Key, Column(Order = 2)]
        public long CodeId { get; set; }
        public virtual SmartCode Code { get; set; }

        public CodeRight CodeRight { get; set; }
}

これには、次の SQL を記述します。

SELECT * 
FROM campaigns 
WHERE campaignid IN (SELECT DISTINCT campaignid  
                     FROM smartcodes t1 
                     INNER JOIN smartcoderights t2 ON t1.codeId = t2.codeId
                     WHERE t2.userid = @userId)

EF を使用して、次のコードを書いています。

var v = user.CodeRights.Select(r => r.Code.Campaign).Distinct().ToList();

プロファイリングでは、EF がすべての CodeRight に対して 2 つの SQL クエリを実行していることがわかります。

また、実行全体の時間を計算しました.ADO.Netを使用している間、EFは約400ミリ秒かかります

私の質問は、EFが本当にこれほど遅いのか、それとも何か間違ったことをしているのかということです。

編集

CodeRightごとに次の2つのブロックが実行されています

exec sp_executesql N'SELECT 
[Extent1].[CodeId] AS [CodeId], 
[Extent1].[CodeTitle] AS [CodeTitle], 
[Extent1].[CodeContent] AS [CodeContent], 
[Extent1].[CreatedOn] AS [CreatedOn], 
[Extent1].[IsActive] AS [IsActive], 
[Extent1].[Deleted] AS [Deleted], 
[Extent1].[OwnerId] AS [OwnerId], 
[Extent1].[Tags] AS [Tags], 
[Extent1].[CampaignId] AS [CampaignId]
FROM [dbo].[SmartCodes] AS [Extent1]
WHERE [Extent1].[CodeId] = @EntityKeyValue1',N'@EntityKeyValue1 bigint',@EntityKeyValue1=24
go

exec sp_executesql N'SELECT 
[Extent1].[CampaignId] AS [CampaignId], 
[Extent1].[Name] AS [Name], 
[Extent1].[Description] AS [Description], 
[Extent1].[AdminId] AS [AdminId]
FROM [dbo].[Campaigns] AS [Extent1]
WHERE [Extent1].[CampaignId] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=12
go
4

1 に答える 1

10

Fetch Plans for Entity Frameworkをよく見てください。EF が結合を実行するには、Includeキーワードを使用する必要があります。

userオブジェクトを取得するときに、最初のクエリの一部にする必要があります。

var user = context.Users
    .Include("CodeRights.Code")
    .Include("CodeRights.Campaign")
    .FirstOrD‌​efault(u => u.Id == id);
于 2013-04-23T15:42:46.433 に答える