簡體   English   中英

在效率更高的Linq中,加入或包含

[英]In Linq, which is more efficient, join or include

我正在嘗試收集對象的集合,並且我想找出哪個更有效。 現在,我的查詢有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秒。

簡單情況不會有任何區別,因為Include調用會生成一個join子句以從includeed屬性獲取數據。 另一方面,如果您只想從包含的導航屬性中選擇某些列,則將無法使用“包含”來做到這一點。 如果使用聯接,則可以指定要包括在結果集中的列。

盡管include是更易於閱讀的語法,但在簡單情況下沒有區別。 但是在某些情況下,包括引起額外的聯接(在EF 6.1之前)。 並造成額外的時間。 這是EF中的錯誤,請在此處報告

無論如何,最好使用EF分析器並監視您的查詢。 Entity Framework Profiler一樣 ,或使用Glimpse EF擴展

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM