Как заказать элементы на основе столбца в дочерней таблице в EF - PullRequest
0 голосов
/ 25 декабря 2018

У меня есть две таблицы (FactorItems и Products), моя таблица Factoritems содержит столбцы Id, ProductId, Qty, IsBuy, а таблица Products содержит столбцы Id, Name, .....

Я хочу использовать код, чтобы выбрать свой продукт, где мой столбец Qty имеет значение (для популярного показа Products в индексе), а у меня есть внешний ключ из столбца ProductId в FactorItemsтаблицы в столбец Id в таблице Product.

И я использую модель виртуального представления в ASP.NET MVC:

model.BestSellersProducts = blProduct.Select().OrderByDescending(p => p.FactorItems.Select(c => c.Qty)).take(3);

Я получаю эту ошибку из своего индекса в foreach:

Исключение типа 'System.ArgumentException' произошло в EntityFramework.SqlServer.dll, но не было обработано в коде пользователя

Дополнительная информация: выражения DbSortClause должны иметь типэто порядок сопоставим.

1 Ответ

0 голосов
/ 25 декабря 2018

Учитывая, что ваши отношения Product и FactorItem имеют One-to-Zero-or-One следующим образом:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public FactorItem FactorItem { get; set; }
}

public class FactorItem
{
    [Key, ForeignKey("Product")]
    public int ProductId { get; set; }
    public int Qty { get; set; }
    public bool IsBuy { get; set; }
    public Product Product { get; set; }
}

Тогда ваш запрос для получения 3 самых продаваемых продуктов должен выглядеть следующим образом:

List<Product> products = dbContext.Products.OrderByDescending(p => p.FactorItem.Qty).Take(3).ToList();

Учитывая, что ваши Product и FactorItem имеют отношение One-to-Many следующим образом:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<FactorItem> FactorItems { get; set; }
}

public class FactorItem
{
    public int Id { get; set; }
    [ForeignKey("Product")]
    public int ProductId { get; set; }
    public int Qty { get; set; }
    public bool IsBuy { get; set; }
    public Product Product { get; set; }
}

Тогда ваш запрос для получения 3-х продаваемых продуктов должен выглядеть следующим образом:

var productList = dbContext.FactorItems.GroupBy(fi => new { fi.ProductId, fi.Product.Name }).Select(g => new
        {
            ProductId = g.Key.ProductId,
            ProductName = g.Key.Name,
            TotalSoldQty = g.Sum(x => x.Qty)
        }).OrderByDescending(x => x.TotalSoldQty).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...