首页 > 解决方案 > 如何根据 EF 中子表中的列对项目进行排序

问题描述

我有两个表(FactorItemsProducts),我的Factoritems表包含列Id, ProductId, Qty, IsBuyProducts表包含列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

EntityFramework.SqlServer.dll 中出现“System.ArgumentException”类型的异常,但未在用户代码中处理

附加信息:DbSortClause 表达式必须具有顺序可比较的类型。

标签: c#entity-frameworklinq

解决方案


考虑到你ProductFactorItemOne-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();

考虑到你ProductFactorItemOne-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();

推荐阅读