【发布时间】:2012-08-02 07:02:29
【问题描述】:
您好,我在 SQL 中有一个存储过程,它是一个带有多个内部连接的简单选择,我将此存储过程转换为 LINQ,并且在执行内存使用率时会攀升,直到出现内存不足异常。我绝对是 LINQ 的新手,所以我希望这正是我做事的方式。下面是LINQ代码
编辑:StockRoomID、CustomerID(整数) 开始日期,结束日期(日期时间) 传入函数的变量
Dim query = (From prds In context.prds
Join prd_colour In context.prd_colours On prd_colour.prd_id Equals prds.prd_id
Join prd_colour_srsp In context.prd_colour_srsps On prd_colour.prd_colour_id Equals prd_colour_srsp.prd_colour_id
Join prd_br In context.prd_brs On prd_br.prd_colour_id Equals prd_colour.prd_colour_id
Join prd_stk_rm In context.prd_stk_rms On prd_stk_rm.prd_br_id Equals prd_br.prd_br_id
Join ct_colour In context.ct_colours On ct_colour.ct_colour_id Equals prd_colour.ct_colour_id
Join ct_pmg In context.ct_pmgs On ct_pmg.ct_pmg_id Equals prds.ct_pmg_id
Join ct_pmg_detail In context.ct_pmg_details On ct_pmg_detail.ct_pmg_id Equals ct_pmg.ct_pmg_id
Join ct_stk_rm In context.ct_stk_rms On ct_stk_rm.ct_br_id Equals ct_pmg_detail.ct_br_id And ct_stk_rm.ct_stk_rm_id Equals prd_stk_rm.ct_stk_rm_id
Join ct_cust_type In context.ct_cust_types On ct_cust_type.ct_cust_type_id Equals ct_pmg_detail.ct_cust_type_id
Join ct_cust_br In context.ct_cust_brs On ct_cust_br.ct_cust_type_id Equals ct_cust_type.ct_cust_type_id
Where prds.prd_invisible_yn = 0 And prds.sell_yn = 1 And prds.ct_apg_id = 3 And ct_stk_rm.ct_stk_rm_id = StockRoomID And _
ct_cust_br.ct_cust_id = CustomerID And prd_colour_srsp.srsp_date_beg <= StartDate And prd_colour_srsp.srsp_date_end >= EndDate Or _
prd_colour_srsp.srsp_date_end Is Nothing And ct_pmg_detail.pmg_date_beg <= StartDate And ct_pmg_detail.pmg_date_end >= EndDate Or _
ct_pmg_detail.pmg_date_end Is Nothing
Select New prd_colour_mix With {.pid = prd_colour.prd_colour_id, .prdcode = prds.prd_sbcode & "-" & ct_colour.ct_colour_code, .prddesc = prds.prd_desc & "-" & ct_colour.ct_colour_desc, .prdLegacyCode = prd_colour.prd_legacy_code}).ToList
这个查询应该返回大约7k条记录,存储过程大约需要500ms来执行
谢谢
【问题讨论】:
-
据我所知,当您使用 ToList() 时,您会忘记延迟加载,查询中的所有数据都会进入您的内存。你确定你需要这个吗?尝试删除它。
-
我应该更具体一点,这是在返回绑定到网格的实体集合的函数中,获取 7k 记录是最坏的情况,但我正在尝试探索我的使用 linq to sql 时的限制作为使用存储过程和返回结果的限制似乎要大得多
-
我认为从查询中返回大量数据(甚至 > 100)不是一个好主意,其中你有 10 个 JOIN,然后将其绑定到网格。您必须使用分页并限制您返回的数据(0、20),并且可能在 20 行上您的 ToList 可以正常工作。我告诉过你,你的问题可能在于大量数据和 ToList() 最终进入内存并引发异常
-
奇怪的是,即使我更改输入参数以使结果为 0 条记录,也会发生同样的事情。内存攀升和异常发生。这就是为什么我认为它与我的查询有关,因为我是 linq 的新手