第XXXX行内存不足

时间:2012-01-06 06:20:30

标签: c# asp.net linq linq-to-sql out-of-memory

任何人都可以帮我解决我的asp页面上的内存不足错误吗?即时通讯使用linq to sql ..添加数据后的几个数据..就像超过10行。在网格中。发生内存不足错误..附上此处是我的添加功能..

public ServiceDetail checkservicedetailid()
{
    string ServiceName = ViewState["Tab"].ToString();
    ServiceDetail checkservicedetailid = ServiceDetails_worker.get(a => a.ServiceName == ServiceName && a.MarginAnalysisID == checkmarginanalysisid().MarginAnalysisID).SingleOrDefault();
    return checkservicedetailid;
}

public IEnumerable<ServiceDetail> get(Expression<Func<ServiceDetail, Boolean>> express)    
{ 
    return ServiceDetailsDB.ServiceDetails.Where(express); 
}

protected void btnSaveEmptyOC_Click(object sender, EventArgs e)
{
   try
   {
       if (checkservicedetailid() != null)
       {
           CashExpense tblCashExpenses = new CashExpense();
           Guid CashExpensesID = Guid.NewGuid();

           tblCashExpenses.CashExpensesID = CashExpensesID;
           tblCashExpenses.ServiceDetailsID = checkservicedetailid().ServiceDetailsID;
           tblCashExpenses.Description = txtDescriptionEmptyOC.Text;
           tblCashExpenses.Quantity = Decimal.Parse(txtQTYEmptyOC.Text);
           tblCashExpenses.UnitCost = Decimal.Parse(txtUnitCostEmptyOC.Text);
           tblCashExpenses.CreatedBy = User.Identity.Name;
           tblCashExpenses.DateCreated = DateTime.Now;
           tblCashExpenses.CashExpensesTypeID = "OTHER";

           CashExpenses_worker.insert(tblCashExpenses);
           CashExpenses_worker.submit();
           //Clear items after saving
           txtDescriptionEmptyOC.Text = "";
           txtQTYEmptyOC.Text = "";
           txtUnitCostEmptyOC.Text = "";
           ValidationMessage.ShowValidationMessage(MessageCenter.CashExpenseMaintenace.InsertOC2, "SaveEmptyOC", this.Page);
           MyAuditProvider.Insert(this.GetType().ToString(), ViewState["MarginAnalysisID"].ToString(), MessageCenter.Mode.ADD, MessageCenter.CashExpenseMaintenace.InsertOC2, Page.Request, User);
           divOtherCost.Visible = false;
           grd_othercost.Visible = true;
           btnaddothercost.Visible = true;
       }
       else
       {
           //Displays a Message on the Validation Summary (Service Id does not exist)
           ValidationMessage.ShowValidationMessage(MessageCenter.CashExpenseMaintenace.SaveServiceDetailOC, "SaveEmptyOC", this.Page);
       }
   }
   catch
   {
       //Displays a Message on the Validation Summary (Error on Saving)
       ValidationMessage.ShowValidationMessage(MessageCenter.CashExpenseMaintenace.InsertOCError, "SaveEmptyOC", this.Page);
   }

   finally
   {
       //Rebinds the Grid
       populategrd_othercost();
    }
}

2 个答案:

答案 0 :(得分:0)

我猜你的代码在这里:

ServiceDetail checkservicedetailid = ServiceDetails_worker.get(
    a => a.ServiceName == ServiceName &&
         a.MarginAnalysisID == checkmarginanalysisid().MarginAnalysisID
).SingleOrDefault();

.get()正在使用Func<SomeType, bool>,您正在执行以下操作:

var row = dbCtx.SomeTable.Where(predicate);

(如果我不对,请在此纠正我)

然而,这是使用LINQ-to-Objects,这意味着:它将每一行从表加载到客户端并在本地进行测试。这会损害内存,特别是如果为每一行创建了不同的db-context。此外,每行正在执行checkmarginanalysisid()调用,大概不会在行之间更改。

您应该使用Expression<Func<SomeType, bool>>对其进行测试,该var marginAnalysisId = checkmarginanalysisid().MarginAnalysisID; ServiceDetail checkservicedetailid = ServiceDetails_worker.get( a => a.ServiceName == ServiceName && a.MarginAnalysisID == marginAnalysisId ).SingleOrDefault(); 将转换为TSQL并在服务器上执行。您可能还需要删除不可翻译的方法,即

get(Expression<Func<SomeType, bool>>)

其中{{1}}。

答案 1 :(得分:0)

我尝试了所有由我的同行给出的解决方案以及此处提供的解决方案,从GC.Collect到使用后处理linq datacontext等但是错误一直在发生,然后我试图删除更新面板,我已经阅读了一个网站,该网站显示了在重复执行功能时处理数据esp时更新面板是多么荒谬。噗!记忆问题消失了!