从不同的表中选择字段
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=>od.StoreId,st=>st.StoreId,(od,st)=>_orders=od,_stores=st).Where(w=>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
【讨论】:
以上是关于从不同的表中选择字段的主要内容,如果未能解决你的问题,请参考以下文章