мне нужно создать нетерпеливые загрузки запрос, который будет выполнять следующие задачи:Как написать жадность загрузка запроса на многом ко многим отношений с дополнительной фильтрацией и сортировками
- Получить родительский объект по идентификатору
- фильтра дочерних объектов по критериям
- Сортировать список потомков лиц
Мой, не нетерпеливый запрос выглядит следующим образом:
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(), но я потерпел неудачу.
Любые идеи?
Я не знаю, что вы сделали неправильно, но в соответствии с документацией EF '.INCLUDE()', как вы Eargerly нагрузки что-то. Для вас вы должны иметь в своем запросе '... .ThenBy (c => c.Product.Name) .Include (« Компания »). Включить (« Продукт »). ToList();' см. Здесь https://msdn.microsoft.com/en-nz/data/jj574232.aspx – Toxicable
@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
@Avanger Просто основываясь на том, что вы показываете нам. Я предполагаю, что это первая настройка кода? Если да, можете ли вы показать нам свой конструктор для вашего контекста? – IdahoSixString