c# - 如何根据 EF 中子表中的列对项目进行排序
问题描述
我有两个表(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
:
EntityFramework.SqlServer.dll 中出现“System.ArgumentException”类型的异常,但未在用户代码中处理
附加信息:DbSortClause 表达式必须具有顺序可比较的类型。
解决方案
考虑到你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();
推荐阅读
- typescript - 我可以强制 TypeScript 解析 Pick 的类型吗
展示? - java - 如何阅读列表
- > 在 Android 中使用 Parcelable
- python - 使用 SQLite 时 SQLAlchemy 中的绑定参数冲突
- javascript - 在 Ext JS 中将字段标签设置为 HTML 字符串
- algorithm - 伪代码格式
- uuid - JDK 11 生成的 UUID 版本是多少?
- angular - 如何将 Angular 项目版本从 12.2.5 降级到 12.2.1?
- c# - 为什么我的列表没有在帖子之间的 PageModel 上保持状态?
- android - 谷歌播放签名密钥
- python - 在 matplotlib 中使用 animation.ArtistAnimation() 返回一个空白