2012-01-06 3 views
1

誰でも私のASPページのメモリ不足エラーを解決する方法を教えていただけますか?私はLinqを使用してSQLに..データを追加した後いくつかのデータ.. 10以上の行のような。グリッド内でFunc<SomeType, bool>を取っている.get()、あなたがやっていることをメモリがXXXXの行にあります

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

:メモリ不足エラーが..私はここにあなたのコードから推測している

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(); 
    } 
} 
+0

'checkservicedetailid()'では何をしていますか? – TheVillageIdiot

+3

でも、if(checkservicedetailid()!= null)の代わりに 'try' var obj = checkservicedetailid(); (tblCashExpenses.ServiceDetailsID = obj.ServiceDetailsID;) – TheVillageIdiot

+0

ここにCashExpenseクラスのプロパティをポストします。 – adatapost

答えて

0

GC.Collectから使用後にlinq datacontextを処理するなど、私の同僚とソリューションの両方で私に与えられたソリューションを試してみましたが、エラーは発生し続けています更新パネル、Iveは、機能が繰り返し実行されたときにデータespを処理することについて、いかにばかげた更新パネルを示したサイトを読んだ。そして、愚か!メモリの問題はなくなりました!

0

..私の追加機能がある添付発生します以下のようなもの:

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

(私は間違ってる場合は、ここで私を修正してください)

これはLINQ-to-Objectsを使用しています。すなわち、テーブルからクライアントへのすべての行をローディングしてローカルにテストしています。これはメモリを傷つけることになります。特に、行ごとに異なるDBコンテキストが作成されている場合にはそうです。さらに、checkmarginanalysisid()コールは行ごとに実行されているため、行間で実行されていると考えられます。

Expression<Func<SomeType, bool>>でこれをテストし、TSQLに変換してサーバーで実行する必要があります。また、翻訳不可能な方法を削除する必要があり、すなわちそれはget(Expression<Func<SomeType, bool>>)ある

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

+0

こんにちは、HERESに私のget関数 公共のIEnumerable (式<のFunc >表現)を取得 { リターンServiceDetailsDB.ServiceDetails.Where(表現)。 } – anonymous1110

+0

これを修正するにはどうすればよいですか? – anonymous1110

+0

@ anonymous1110あなたが示唆しているように、式が...ならば、SQLトレース(または同様のもの)を行い、どのデータが配線を通過しているか確認できますか?どのようなクエリなどですか?主にチェックする:それはどこでフィルタリングですか? –

関連する問題