2016-06-07 33 views
0

我需要創建一個預先加載查詢,將執行以下任務:通過ID 如何寫熱切許多加載查詢與額外的過濾許多關係和排序

  • 過濾子實體

    • 獲取父實體實體的通過標準
    • 排序子列表

    我不急於查詢看起來是這樣的:

    var company = _dbContext.Companies.FirstOrDefault(c => c.Id == companyId); 
    
    if (company != null) 
    { 
        company.CompanyProducts = 
         company.CompanyProducts 
           .Where(cp => cp.IsBuyable && cp.Product.IsPublished) 
           .OrderByDescending(c => c.Product.PublishDate) 
           .ThenBy(c => c.Product.Name) 
           .ToList(); 
    } 
    
    return company; 
    

    如果實體有這樣的結構:

    public class Company 
    { 
        public long Id { get; set; } 
        public string Name { get; set; } 
    
        [ForeignKey("CompanyId")] 
        public virtual ICollection<CompanyProduct> CompanyProducts { get; set; } 
    } 
    
    public class CompanyProdcut 
    { 
        public long Id { get; set; } 
        public long CompanyId { get; set; } 
        public long ProductId { get; set; } 
        public bool IsBuyable { get; set; } 
    
        public virtual Company Company { get; set; } 
        public virtual Product Product { get; set; } 
    } 
    
    public class Product 
    { 
        public long Id { get; set; } 
        public string Name { get; set; } 
        public DateTime PublishDate { get; set; } 
        public bool IsPublished { get; set; } 
    
        [ForeignKey("ProductId")] 
        public virtual ICollection<CompanyProduct> CompanyProducts { get; set; } 
    } 
    
    public class MyDbContext : DbContext 
    { 
         public MyDbContext() : base("name=connectionString") 
         { 
          Database.Log = s => System.Diagnostics.Debug.WriteLine(s); 
         } 
    
         public virtual IDbSet<Product> Products { get; set; } 
         public virtual IDbSet<Company> Companies { get; set; } 
         public virtual IDbSet<CompanyProduct> CompanyProducts { get; set; } 
    
    } 
    

    這是許多經典到使用實體中間存儲addtional數據一對多的關係。

    Company -|---------|<CompanyProduct>|---------|- Product 
    

    如何在這種情況下,我可以重寫不急於查詢急於查詢,將在一個SQL調用所做的一切?我試圖自己使用。包括()但我失敗了。

    任何想法?

  • +0

    我不知道你做錯了什麼,但根據EF文件'.INCLUDE()'是你Eargerly負載的東西怎麼樣。對你而言,你應該在查詢中使用'... .ThenBy(c => c.Product.Name).Include(「Company」).include(「Product」)。ToList();'see here https:/ /msdn.microsoft.com/en-nz/data/jj574232.aspx – Toxicable

    +0

    @Avangar那麼什麼是錯的,company.CompanyProducts = company.CompanyProducts .Include(x => x.Company).Include(x => x.Product) 。凡(CP => cp.IsBuyable && cp.Product.IsPublished)) .OrderByDescending(C => c.Product.PublishDate) .ThenBy(C => c.Product.Name) 。 ToList();? – IdahoSixString

    +0

    @Avanger基於您向我們展示的內容。我假設這是一個代碼第一次安裝?如果是這樣,你能告訴我們你的上下文的構造函數嗎? – IdahoSixString

    回答

    0

    我不認爲這是最好的辦法,但你可以在下面顯示的兩個位置中有.Include()聲明。如果你把它包含在第一個查詢中,那麼我認爲你可以很好地使用你的方法來進行第二個查詢,但是我沒有測試過對此不確定。

    你不能在你的例子中使用它的原因是它只能用在IQueryable()對象上,而Company和ICollection不是。

    var _dbContext = new MyDbContext(); 
    var company = _dbContext.Companies.Include("").SingleOrDefault(c => c.Id == companyId); 
    
    var products = _dbContext.Companies.Include("").SingleOrDefault(c => c.Id == companyId) 
           ?.CompanyProducts 
           .Where(cp => cp.IsBuyable && cp.Product.IsPublished) 
           .OrderByDescending(c => c.Product.PublishDate) 
           .ThenBy(c => c.Product.Name) 
           .ToList(); 
    
    if(company != null) 
    { 
        company.CompanyProducts = products; 
    } 
    return company; 
    
    0
    var company = _dbContext.Companies.Include(x => x.CompanyProducts).Includex => x.CompanyProducts.Select(y => y.Company).Includex => x.CompanyProducts.Select(y => y.Product).FirstOrDefault(c => c.Id == companyId); 
    if (company != null) 
    { 
        company.CompanyProducts = 
         company.CompanyProducts 
          .Where(cp => cp.IsBuyable && cp.Product.IsPublished) 
          .OrderByDescending(c => c.Product.PublishDate) 
          .ThenBy(c => c.Product.Name) 
          .ToList(); 
    } 
    
    return company; 
    

    要獲得拉姆達包括確保添加引用對System.Data.Entity。

    https://msdn.microsoft.com/en-us/library/dn176380(v=vs.113).aspx

    相關問題