我正在尝试获取一组对象,我想找出哪些更有效。现在我的查询获得了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秒。
答案 0 :(得分:3)
简单情况没有区别,因为Include
调用会生成一个join子句来从包含的属性中获取数据。另一方面,如果您只想从包含的导航属性中选择一些列,则无法使用Include执行此操作。如果使用连接,则可以指定要包含在结果集中的列。
答案 1 :(得分:2)
虽然include是更简单的语法阅读,但在简单的情况下没有区别。 但在某些情况下包括引起额外连接(在EF 6.1之前)。并导致额外的时间。这是EF中的一个错误并报告了here
最好使用EF Profiler并监控查询。与Entity Framework Profiler类似,或使用Glimpse EF extension