1

EF4 / LINQを初めて使用していますが、問題が発生しました。次のように、foreachループを使用してLINQクエリの結果をループしています。

   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ループ内でcall.LeadActionの割り当てを行うにはどうすればよいですか?

また、EF / LINQへの最初の進出であるため、クエリを記述したり、操作を実行したりする方法に設計上の問題があるかどうかも知りたいです。

4

1 に答える 1

0

新しい匿名タイプを作成しています-Linq結合を使用して、その値を設定しようとしています。あなたが本当にやりたいことは、呼び出しのLeadAction正しい更新ですか?

EFは、データベースに戻ることができるように、新しいクエリをエンティティに変換して戻すことをどのように知っていますか?それはたくさんのフープを通過しなければならないでしょう、そしてそれはそれができません。

あなたができることは、Callデータベースからを取得し、そのように設定することです-それがあなたのPKであるとLeadAction仮定して、私は検索を使用しています:CallID

                  case 39:    // Not Answered
                       var thisCall = context.T_Call.Find(call.CallID)
                       thisCall.LeadAction = ACTION_CALL_ATTEMPT;                              
                       break;
于 2012-10-25T13:56:56.250 に答える