【问题标题】:LINQ to SQL Query using all memory before timing outLINQ to SQL 查询在超时前使用所有内存
【发布时间】: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 的新手

标签: vb.net linq


【解决方案1】:

它很可能在客户端做一些你希望它在服务器端做的事情。

下载LINQPad(免费),启动它并添加与数据源的连接,选择添加的数据源作为查询的活动数据源,将语言设置为“VB 语句”,然后运行它。在结果输出窗口中选择“SQL”选项卡并检查 SQL。然后你会看到服务器端处理的表达式的哪些部分。

【讨论】:

  • 感谢 Tormod,很棒的提示很棒的程序。通过调查 SQL 代码,我可以在 LINQ 语句中查看我的错误,该错误涉及 where 子句中缺少括号:)
猜你喜欢
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-23
相关资源
最近更新 更多