2016-10-18 9 views
0

これはなぜコンパイルできますが、実行時にSQL /エンティティに正しく変換できないため、例外を作成する理由を説明できますか?舞台裏で起こっていることを理解しようとしています。なぜLINQはstring.IsNullOrWhiteSpace()を変換できないのですか?

var data = (from e in db.Employees 
      join egp in db.EmployeeGrievanceMappings on e.EmployeeID equals egp.EmployeeID 
      join et in db.EmployeeTypes on egp.EmployeeTypeID equals et.EmployeeTypeID 
        where et.EmployeeTypeName == employeeeType 
      select new GrievantStewardBO() 
      { 
       Id = e.EmployeeADID, 
       EmployeeID = e.EmployeeID, 
       EmployeeTypeID = egp.EmployeeTypeID, 
       GrievanceID = egp.GrievanceID, 
       EmployeeGrievanceID = egp.EmployeeGrievanceID, 
       text = string.IsNullOrWhiteSpace(e.EmployeeLastName) ? e.EmployeeFirstName : e.EmployeeLastName + "," + e.EmployeeFirstName, 
       FirstName = e.EmployeeFirstName, 
       LastName = e.EmployeeLastName 

      }). 
     ToList(); 

私はこれを書いて正しく動作させることができますが、LINQを使って同様のランインを理解したかっただけです。

text = e.EmployeeLastName == null || e.EmployeeLastName.Trim() == "" ? e.EmployeeFirstName : e.EmployeeLastName + "," + e.EmployeeFirstName 

関連する質問:Trim()がLINQで正しく翻訳するのはなぜですか?

+1

Linqからオブジェクトへの処理は可能ですが、Linq-toによってSqlへの変換はできません-sql。 linq to sqlのサポートされていない文字列メソッドの完全な一覧は次のとおりです。https://msdn.microsoft.com/en-us/library/bb882672(v=vs.110).aspx – Igor

+5

エンティティプロバイダを誰にもプログラムしていないのでその式をSQLに変換します。機能は無料ではありません。 [here](https://msdn.microsoft.com/en-us/library/bb738681.aspx)でサポートされている文字列関数を確認することができます –

+0

は、このlinq SQLまたはエンティティのフレームワークまたは何か他のですか? –

答えて

4

Entity FrameworkまたはLinq2Sql 。 LINQ to Entitesを使用すると、linq文が式に変換され、解析され、SQLクエリに変換されます。あなたが持っている問題は、 "解析"ステップを書いた人がパーサーでstring.IsNullOrWhiteSpaceをサポートしていないので、その関数をSQL文字列に変換する方法がわからないほど簡単です。

あなたが示したような長いフォームを使用するか、それをサポートするライブラリの新しいバージョンに更新する必要があります。 GitHubのバージョンがEntity Framework 6 does IsNullOrEmptyであるようですが、おそらくIsNullOrWhitespaceの新しいメソッドを作成し、それをマージするリクエストを行うことができます。

0

LINQにはexpressionがあり、SQLに変換されます。誰かが式を評価して結果のSQLを作成する必要があります。このプロセスはIsNullOrWhiteSpace()と何をするのかわからないため、失敗します。

0

なぜですか?誰もあなたが使用しているLINQプロバイダでこの特定のメソッドを処理するコードを書いていません。メソッド呼び出しは、何らかの手順でSQL(またはプロバイダが変換するもの)に変換されません。メソッド呼び出しはケースバイケースで処理され、共通メソッドはプロバイダにハードコードされます。誰もこのメソッドを扱うコードを書かなかった場合、このメソッドは機能しません。

別のメモで、なぜこの特定の方法を処理しなかったのでしょうか?おそらく、彼らは世代コードのためにLINQのコードを再利用していたのでしょうか、.NET Framework 3.5で作業したいと思っていました。このメソッドは4.0で追加されました

関連する問題