代码之家  ›  专栏  ›  技术社区  ›  specimen

使用Load*方法时如何设置引用的条件/筛选器

  •  0
  • specimen  · 技术社区  · 10 年前

    我有两张桌子:顾客和订单。客户参考的订单如下:

    [Reference]
    public List<Order> Orders { get; set; }
    

    Order类具有一个属性 Deleted 。我希望加载所有客户(或子集),并包括订单,但不包括已删除=true的订单。这可以用LoadSelect方法完成吗?或者推荐的方法是什么?

    大致等于以下SQL的内容:

    select * from Customers C 
    join Orders O on O.CustomerId = C.Id 
    where O.Deleted = False
    

    这是最好的方法吗?

    var orderIds = resp.Customers.Select(q => q.Id).ToList();
    var allOrders = Db.Select<Order>(o => orderIds.Contains(o.CustomerId) && !o.Deleted);
    foreach (var order in allOrders)
    {
        var cust = resp.Customers.First(q => q.Id == order.custivityId);
        if (cust.Orders == null) cust.Orders = new List<Order>();
        cust.Orders.Add(order);
    }
    
    1 回复  |  直到 10 年前
        1
  •  1
  •   mythz    10 年前

    我刚刚添加了一个 Merge 美国石油学会 in this commit 自动将父集合与其子引用连接起来,这将使这一点更容易。

    使用新的API,您可以分别选择客户和订单,并将集合合并在一起,例如:

    //Select only Customers which have valid orders
    var customers = db.Select<Customer>(q =>
        q.Join<Order>()
         .Where<Order>(o => o.Deleted == false)
         .SelectDistinct());
    
    //Select valid orders
    var orders = db.Select<Order>(o => o.Deleted == false);
    
    customers.Merge(orders); //merge the results together
    
    customers.PrintDump();   //print the results of the merged collection
    

    此更改可从 4.0.39版+ 那就是现在 available on MyGet .