在Linq,更有效率,加入或包括

时间:2016-03-11 17:28:33

标签: c# linq

我正在尝试获取一组对象,我想找出哪些更有效。现在我的查询获得了16个结果,但我们可能正在使用1000s的数据集。

假设我正在使用以下模型:

public ProjectSubmission()
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    public Guid ProjectSubmissionId { get; set; }

    public System.Guid ProjectId { get; set; }
    [ForeignKey("ProjectId")]
    public virtual Project Project { get; set; }

    public string SubmissionTitle { get; set; }  
}

public Project()
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    public Guid ProjectId { get; set; }

    public string Title { get; set; } 
}

这将为我提供更好的表现,这个:

var subVModel = 
(
    from ps in db.ProjectSubmission
        .Include(s => s.Project)
    where ps.IsActive
        && (filter.ProjectId == Guid.Empty || ps.Project.ProjectId == filter.ProjectId)
        && (filter.SubmissionTitle == string.Empty || ps.SubmissionTitle .Contains(filter.SubmissionTitle))
    select ps); 

或:

var subVModel = 
(
    from ps in db.ProjectSubmission
    join p in db.Project on ps.ProjectId equals p.ProjectId
    where ps.IsActive
        && (filter.ProjectId == Guid.Empty || p.ProjectId == filter.ProjectId)
        && (filter.SubmissionTitle == string.Empty || ps.SubmissionTitle .Contains(filter.SubmissionTitle))
    select ps); 

现在他们两次都有16个记录的.032秒。

2 个答案:

答案 0 :(得分:3)

简单情况没有区别,因为Include调用会生成一个join子句来从包含的属性中获取数据。另一方面,如果您只想从包含的导航属性中选择一些列,则无法使用Include执行此操作。如果使用连接,则可以指定要包含在结果集中的列。

答案 1 :(得分:2)

虽然include是更简单的语法阅读,但在简单的情况下没有区别。 但在某些情况下包括引起额外连接(在EF 6.1之前)。并导致额外的时间。这是EF中的一个错误并报告了here

最好使用EF Profiler并监控查询。与Entity Framework Profiler类似,或使用Glimpse EF extension