2012-10-25 4 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가 어떻게 알 수 있습니까? 그것은 많은 농구를 거쳐야 할 것이고, 그렇게 할 수는 없습니다.

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

우수, 일 : CallID이 PK라고 가정하면, 내가 찾기를 사용하고 있습니다 - 당신은 무엇을 할 수 있는지

는 데이터베이스에서 Call를 검색하고 LeadAction 그 방법을 설정합니다. EF가 엔티티로 다시 할당을 변환 할 수없는 이유는 쿼리에서 조인 때문입니다. 내 코드 예제에서 'query'라는 원래 쿼리 ("query")에 조인이 없으면 foreach 루프에서 할당이 작동합니까? – BrianKE

+0

수정 - 실제 엔터티 유형 (이 경우에는 호출)을 반환해야하는 경우. –

+0

실제로 문제를 일으키는 조인은 아니지만 새로운 개체를 반환한다는 사실입니다. 새로운 {co.CallID, co.LeadAction}과 같은 새 객체를 반환하면 조인없이 동일한 문제가 발생합니다. 또한 당신은 당신의 새로운 선택의 새로운 {공동 MMLeadID = lv.email_text, ca.OutcomeID, ... } 내부 전체 개체를 반환하여 문제를 방지 할 수 있습니다; – sgmoore

관련 문제