2017-10-28 132 views
0

同じクエリは.Net 3.5では機能しましたが、.Net 4.5.2では機能しませんでした 同じエラーの記事がたくさんあります。つかいます。 私はすべてをクエリ用の別の変数に抽出しました。それでもエラーが表示される -LINQ to Entities - メソッドをストア式に変換することはできません

LINQ to Entitiesは、 'System.String Format(System.String、System.Object)'メソッドを認識せず、このメソッドをストア式に変換できません。

private void LoadAppointmentData() 
     { 
      var user = Session["user"].ToString(); 
      var userFirstName = db.Users.SingleOrDefault(u => u.FirstName == user); 

      var userFN = userFirstName.username; 
      var chwWorker = from c in db.PatientContacts 
          where c.UserName == userFN && 
           (c.PCP_Status == "Appointment Made" || c.PCP_Status_AWC == "Appointment Made" 
            || c.PCP_Status_AWDV == "Appointment Made" || 
           (c.PCP_Status == "RX for Mamogram" && c.Status == "Appointment Made")) 
          orderby c.PCP_Status_Date descending 
          select new 
          { 
           Id = c.MemberID, 
           Name = c.PatientFirstName + " " + c.PatientLastName, 
           PCP_Appt = $"{c.PCP_Status_Date:d}", 
           Mammogram_Appt = $"{c.StatusDate:d}", 
           Phone = GetPhone(c.MemberID) 
          }; 
      if (chwWorker.Any()) 
      { 
       if (grvAppointmentList != null) 
       { 
        pnlAppointmentFollowUp.Visible = true; 
        grvAppointmentList.DataSource = chwWorker; 
        grvAppointmentList.DataBind(); 
       } 
      } 
} 

私は、このクエリの実行を行うために変更することが他に何かわかりません。

+3

'$ "{c.PCP_Status_Date:D}が"' [ 'String.Format'ある](https://docs.microsoft.com/en-us/ dotnet/csharp/language-reference/keywords/interpolated-strings)を参照してください。私はあなたがエラーが何を意味するかを知っていると思います。 –

+0

しかし、以前のバージョンでも同じように動作しました... – Ron

+3

いいえ、string.Formatは、Entity Frameworkではサポートされていません。私は、SQLに変換できなかったLINQクエリの部分のクライアント側の評価に自動的に切り替えた.Net 3.5でLINQ-to-SQLを使用したと仮定します。 –

答えて

1

あなたはSelectを使用する前にAsEnumerable()ToList()を使用してstring.Formatまたは補間文字列を実行するための「オブジェクトへのLINQ」を使用する必要があります。string.Format方法は、エンティティへのLINQで認識されていないとして、それを翻訳し

var chwWorker = (from c in db.PatientContacts 
       where c.UserName == userFN && 
        (c.PCP_Status == "Appointment Made" || c.PCP_Status_AWC == "Appointment Made" 
         || c.PCP_Status_AWDV == "Appointment Made" || 
        (c.PCP_Status == "RX for Mamogram" && c.Status == "Appointment Made")) 
       orderby c.PCP_Status_Date descending select c) 
       .AsEnumerable() // or 'ToList()' 
       .Select(c => new 
       { 
        Id = c.MemberID, 
        Name = c.PatientFirstName + " " + c.PatientLastName, 
        PCP_Appt = $"{c.PCP_Status_Date:d}", 
        Mammogram_Appt = $"{c.StatusDate:d}", 
        Phone = GetPhone(c.MemberID) 
       }); 

に留意されたいです。 SQLコマンドです。したがって、メモリへのクエリ結果のマテリアライゼーションが必要です。

NB:Any()メソッドを使用する前にLINQ to Entitiesクエリを使用する場合はSqlFunctions.StringConvertを使用できますが、すべてのSQLプロバイダでSQLステートメントに変換できるわけではありません。

に関する問題:

LINQ to Entities does not recognize the method 'System.String Format

+0

あなたの解決策を試してみてください更新します – Ron

+0

Thanks @ Tetsuya Yamamoto - このように動作するためには、Select演算子を使用しなければなりませんでした。 "... orderby c.PCP_Status_Date select c).AsEnumerable()..."今は大丈夫です。他の賢明な、それは "クエリの本文を選択句またはグループ句で終了する必要があります投げている。これを解決するためにあなたの助けをありがとう。 – Ron

関連する問題