从不同的表中选择字段

Posted

技术标签:

【中文标题】从不同的表中选择字段【英文标题】:Selecting fields from different table 【发布时间】:2019-10-15 17:42:28 【问题描述】:

我有 3 张桌子。订单、订单线和商店。在 Order 表中有 StoreId,它是来自 Stores 表的外键,在 Orderlines 表中有 OrderId 来自 Order 表的外键。我只需要获取字段 Order.OrderId、Order.WarehouseOrderId、Store.StoreName 和每个订单的订单行数。所以目前这是我的实现:

public List<Order> GetOrdersDashboardWithoutStatus1(SearchDashboardCriteria cri)

    using (var ctx = CreateDbContext())
    
        var orders = (from items in ctx.Orders select items);
        if (cri.MerchantId != 0)
        
            orders = orders.Where(x => x.Store.MerchantId == cri.MerchantId);
        

        return orders.Where(x => (DbFunctions.TruncateTime(x.DateImported) >= DbFunctions.TruncateTime(cri.StartDate))
                && (DbFunctions.TruncateTime(x.DateImported) <= DbFunctions.TruncateTime(cri.EndDate)))
                 .Include(x => x.Store).Include(x => x.OrderLines).ToList();
    

虽然目前的实现正在运行,但性能非常缓慢,有时它会出现超时错误,因为记录可能有 30K+ 订单。

【问题讨论】:

您可以为此使用Linq Join()。您可以使用类似:var _storeOrders = ctx.Orders.Join(ctx.Store,od=&gt;od.StoreId,st=&gt;st.StoreId,(od,st)=&gt;_orders=od,_stores=st).Where(w=&gt;w._stores.MerchantId==cri.MerchantId).ToList() 来获取与merchantId 相关的所有orders+store 信息,然后使用此变量加入OrderLines 并获得适当的结果。 请在问题中包含您的模型。您可以尝试匿名投影,它只会返回您需要的列,而不是包含所有数据。 【参考方案1】:

你可以试试这样的

using (var ctx = CreateDbContext())

            var orders = (from x in ctx.Orders 
                          where x.Store.MerchantId == cri.MerchantId
                          && add your other where condition
                          select NewDataModel
                          
                            orderId = x.OrderId,
                            wareHouse = x.WarehouseOrderId,
                            storeName = x.Store.StoreName
                          ).ToArray();


匿名投影或投影到您的自定义模型仅检索投影中包含的列。

不是Select * from Orders ...,而是Select OrderId,WareHouseOrderId from Orders

如果您的用例支持,您也可以尝试分页(Take,skip)。 Similar answer for anonymous projection

【讨论】:

以上是关于从不同的表中选择字段的主要内容,如果未能解决你的问题,请参考以下文章

从 2 个不同的表中选择

SQL,如何从不同的表中选择属性?

如何从 SQLite 中的表中选择最新的 100 个不同条目?

Mysql 从不同的表中按名称选择

如何从不同的表中选择数据?

从 Sql 中的表中选择不同的日期间隔