2012-10-25 126 views
1

我第一次使用EF4/LINQ並遇到問題。在foreach循環中更新對象

private static void OnTimedEvent(object source, ElapsedEventArgs e) 
    { 
     CallOutcomeSubmission los = new CallOutcomeSubmission();  
     client = connectToService(); 

     try 
     { 
     using (var context = new CallOutcomeContext()) 
     { 
      // List of available actions 
      private static string ACTION_CALL_ATTEMPT = "Call Attempt"; 
      DateTime oneDayAgo = DateTime.Now.AddHours(-24); 
      var query = from co in context.T_MMCallOutcome 
         join ca in context.T_Call on co.CallID equals ca.CallID 
         join lv in context.T_LeadVendorEmailHeader on co.LeadVendorEmailID equals lv.LeadVendorEmailID 
         where co.EnteredOn > oneDayAgo && co.MMLeadActionID == null 
         select new 
         { 
          co.CallOutcomeID, 
          co.CallID, 
          co.LeadVendorEmailID, 
          MMLeadID = lv.email_text, 
          ca.OutcomeID, 
          lv.FranchiseNumber, 
          co.MMLeadActionID, 
          co.LeadAction 
         }; 

      // if any results found for query 
      if (query.Any()) 
      { 
       foreach (var call in query.ToList()) 
       { 
        // if the franchise exists 
        if (client.FranchiseExists(int.Parse(call.FranchiseNumber))) 
        { 
        switch (call.OutcomeID) 
        { 
         case 39: // Not Answered 
          call.LeadAction = ACTION_CALL_ATTEMPT; 
          break; 
         case 43: // Remove from Call List 
          break; 
         default: // If the OutcomeID is not identified in the case statement 
          break; 
        } // switch 

        } 
        else 
        { 
        los.eventLog.WriteEntry("CallOutcomeSubmission.OnTimedEvent: No franchise found with franchise ID " + call.FranchiseNumber); 
        } 

        // Save any changes currently on context 
        context.SaveChanges(); 

       } // foreach 

      } 

      // if no results found from query write system log stating such 
      else 
      { 
       los.eventLog.WriteEntry("CallOutcomeSubmission.OnTimedEvent: No new entries found"); 
      } 
     } // using 

     client.Close(); 
     } 
     catch (System.TimeoutException exception) 
     { 
     los.eventLog.WriteEntry("CallOutcomeSubmission.OnTimedEvent:" + exception.ToString()); 
        client.Abort(); 
     } 
     catch (System.ServiceModel.CommunicationException exception) 
     { 
     los.eventLog.WriteEntry("CallOutcomeSubmission.OnTimedEvent:" + exception.ToString()); 
        client.Abort(); 
     } 
    } 

當我嘗試做任務:

call.LeadAction = ACTION_CALL_ATTEMPT; 

我得到的

Property or indexer 'AnonymousType#2.LeadAction' cannot be assigned to -- it is read only 
生成錯誤我使用foreach循環如下循環直通LINQ查詢的結果

我似乎無法找到任何有關執行Google搜索的特定錯誤,但我不確定自己做錯了什麼。是否因爲原始查詢包含連接?

如何在foreach循環中完成call.LeadAction的賦值?

我也想知道是否有設計問題的方式我寫了查詢或執行任何操作,因爲這是我第一次進入EF/LINQ。

回答

0

您正在創建一個新的匿名類型 - 與Linq連接,然後嘗試設置該值。你真正想要做的是更新電話的LeadAction是否正確?

EF如何知道將您的新查詢翻譯回實體,以便它可以返回到數據庫?這將不得不經歷很多環節,而且這是不可能的。

你可以做什麼,是檢索數據庫中的Call並設置LeadAction這樣 - 我用查找,假設CallID是你PK:

    case 39: // Not Answered 
         var thisCall = context.T_Call.Find(call.CallID) 
         thisCall.LeadAction = ACTION_CALL_ATTEMPT;        
         break; 
+0

良好,即工作。需要說明的是,EF無法將作業轉換回實體的原因在於查詢中的連接?如果原始查詢(我的代碼示例中的'查詢')沒有包含任何連接,那麼foreach循環中的賦值就可以工作? – BrianKE

+0

正確 - 如果你要返回實際的實體類型(在這種情況下調用)。 –

+0

這不是真正的導致問題的連接,而是你正在返回一個新對象的事實。如果你返回了一個新的對象,例如new {co.CallID,co.LeadAction},那麼你會在沒有連接的情況下得到相同的問題。您可能還可以通過返回內部新的選擇新 {合作, MMLeadID = lv.email_text, ca.OutcomeID, ... }完整實體,以避免問題; – sgmoore