c# sugersql 获取子表数据排序

发布于:2025-06-29 ⋅ 阅读:(14) ⋅ 点赞:(0)

在C#中使用Sugar ORM(一个流行的.NET ORM框架)获取子表数据并进行排序,可以通过以下几种方式实现:

1. 使用HasManyHasOne配置

首先,确保你在配置实体时已经正确设置了HasManyHasOne关系。例如,假设你有一个Order实体和一个OrderDetail实体,其中Order有一个到OrderDetailHasMany关系。

public class Order
{
    public int OrderId { get; set; }
    // 其他属性
    public List<OrderDetail> OrderDetails { get; set; }
}
 
public class OrderDetail
{
    public int OrderDetailId { get; set; }
    public int OrderId { get; set; }
    // 其他属性
}

在配置时,你可以这样设置关系:

[SugarTable("Orders")]
public class Order
{
    [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
    public int OrderId { get; set; }
    // 其他属性
    [SugarColumn(IsIgnore = true)]
    public List<OrderDetail> OrderDetails { get; set; }
}
 
[SugarTable("OrderDetails")]
public class OrderDetail
{
    [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
    public int OrderDetailId { get; set; }
    [SugarColumn(IsIgnore = true)]
    public int OrderId { get; set; }
    // 其他属性
}

然后,在查询主表时自动加载子表数据:

var db = new SqlSugarClient(new ConnectionConfig() { /* 配置信息 */ });
var orders = db.Queryable<Order>()
               .Where(o => o.OrderId == someId) // 根据需要添加查询条件
               .OrderBy(o => o.OrderId) // 对主表进行排序
               .Select(o => new { o, OrderDetails = SqlFunc.Subqueryable<OrderDetail>()
                                                           .Where(od => od.OrderId == o.OrderId)
                                                           .OrderBy(od => od.OrderDetailId) // 对子表进行排序
                                                           .Select(od => od) }) // 子查询选择子表数据并排序
               .ToList();

2. 使用JoinQueryable进行连接查询和排序

如果你想要更灵活地处理连接查询和排序,可以使用JoinQueryable。例如:

var orders = db.Queryable<Order, OrderDetail>((o, od) => o.OrderId == od.OrderId) // 连接条件
               .Select((o, od) => new { o, od }) // 选择需要的数据列(如果有特定需求的话)
               .Where(o => o.o.OrderId == someId) // 主表查询条件
               .OrderBy(o => o.o.OrderId) // 对主表进行排序
               .OrderBy(o => o.od.OrderDetailId) // 对子表进行排序(如果有需要的话)
               .ToList(); // 执行查询并获取结果列表

3. 使用LINQ扩展方法进行排序(适用于简单场景)

如果只是简单地对结果进行排序,可以直接在LINQ查询后使用.OrderBy().OrderByDescending()方法:

var orders = db.Queryable<Order>()
               .Where(o => o.OrderId == someId) // 根据需要添加查询条件
               .OrderBy(o => o.OrderId) // 对主表进行排序(如果有需要的话)也可以对子表进行排序,但通常在加载后处理列表数据时进行。
               .ToList(); // 获取结果列表,然后在内存中处理子表的排序等。例如:orders.ForEach(o => o.OrderDetails.OrderBy(od => od.OrderDetailId));

对于子表的排序,通常在内存中处理会更方便,例如:

foreach (var order in orders) {
    order.OrderDetails = order.OrderDetails.OrderBy(od => od.OrderDetailId).ToList(); // 在内存中对每个订单的详情进行排序。
}
  • 关系配置:确保通过HasManyHasOne正确配置实体间的关系。

  • 查询与排序:使用SubqueryableJoinQueryable或LINQ进行


网站公告

今日签到

点亮在社区的每一天
去签到