0

мне нужно создать нетерпеливые загрузки запрос, который будет выполнять следующие задачи:Как написать жадность загрузка запроса на многом ко многим отношений с дополнительной фильтрацией и сортировками

  • Получить родительский объект по идентификатору
  • фильтра дочерних объектов по критериям
  • Сортировать список потомков лиц

Мой, не нетерпеливый запрос выглядит следующим образом:

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 вызова? Я попытался сделать это сам, используя .Include(), но я потерпел неудачу.

Любые идеи?

+0

Я не знаю, что вы сделали неправильно, но в соответствии с документацией EF '.INCLUDE()', как вы Eargerly нагрузки что-то. Для вас вы должны иметь в своем запросе '... .ThenBy (c => c.Product.Name) .Include (« Компания »). Включить (« Продукт »). ToList();' см. Здесь https://msdn.microsoft.com/en-nz/data/jj574232.aspx – Toxicable

+0

@Avangar Итак, что случилось с компанией company.CompanyProducts = company.CompanyProducts . Включить (x => x.Company) .Include (x => x.Product) .где (ср => cp.IsBuyable && cp.Product.IsPublished)) .OrderByDescending (с => c.Product.PublishDate) .ThenBy (с => c.Product.Name) . К списку();? – IdahoSixString

+0

@Avanger Просто основываясь на том, что вы показываете нам. Я предполагаю, что это первая настройка кода? Если да, можете ли вы показать нам свой конструктор для вашего контекста? – IdahoSixString

ответ

0

Я бы не счел это лучшим подходом, но вы можете иметь оператор .Include() в двух положениях, которые я привел ниже. Если вы включите его в первый запрос, я думаю, что вы будете в порядке использовать свой метод для второго, но я не проверял, чтобы не знать об этом.

Причина, по которой вы не можете использовать ее в позициях в вашем примере, потому что она может использоваться только для объекта IQueryable(), которого нет в компании и 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

 Смежные вопросы

  • Нет связанных вопросов^_^