Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架执行的查询太多_C#_Sql Server_Asp.net Mvc_Performance_Entity Framework - Fatal编程技术网

C# 实体框架执行的查询太多

C# 实体框架执行的查询太多,c#,sql-server,asp.net-mvc,performance,entity-framework,C#,Sql Server,Asp.net Mvc,Performance,Entity Framework,我需要找到特定用户的不同活动。用户拥有CodeRights、CodeRights包含代码和代码包含活动。这是CodeRight类 public class SmartCodeRight { [Key, Column(Order = 1)] public long UserId { get; set; } public virtual User User { get; set; } [Key, Column(Order = 2)]

我需要找到特定用户的不同活动。用户拥有CodeRights、CodeRights包含代码和代码包含活动。这是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正在为每个代码执行2个SQL查询

我还计算了整个执行的时间,EF需要约400毫秒,而使用ADO.Net时只需约8毫秒

现在我的问题是,如果EF真的这么慢,或者我做错了什么

编辑

对每个CodeRight执行以下两个块

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


你应该花点时间看看。为了让EF执行连接,您必须使用
Include
关键字

当您获取
用户
对象时,它必须是初始查询的一部分:

var user = context.Users
    .Include("CodeRights.Code")
    .Include("CodeRights.Campaign")
    .FirstOrD‌​efault(u => u.Id == id);

您能显示执行查询的代码吗?这个问题()表明EF应该使用
DISTINCT
生成一个正确的查询。ORM的权衡是它们“健谈”。大多数时候,表演“足够好”。但是他们很健谈。但是您花更少的时间编写定制ORM代码。选择一种毒药。您可以做的一件事是查看EF如何发出查询,并查看是否有值得添加的索引。@w.brian请查看编辑内容。您尚未将这些项目设置为外键,但不确定这是否会产生影响。@mattytomo所有外键都已正确配置。我已经交叉检查了数据库。CodeRights是CodeRights类型的集合,因此不能有“Include”。Include必须是返回用户的查询的一部分,类似于
var user=context.Users.Include(“CodeRights.code”).Include(“CodeRights.Campaign”).FirstOrDefault(u=>u.Id==Id)@DmitryStarosta喊得好,没发现。更新:)这样做
var v=db.SmartCodeRights.Where(r=>r.UserId==user.UserId)。Include(r=>r.code)。Include(r=>r.code.Campaign)。选择(r=>r.code.Campaign)。Distinct().ToList()var user = context.Users
    .Include("CodeRights.Code")
    .Include("CodeRights.Campaign")
    .FirstOrD‌​efault(u => u.Id == id);