2017-02-09 7 views
1

明確にするために、私はEFコールの結果に.Cast<T>を実行することに言及していません。Entity Frameworkクエリの `Where`部分にキャストする方法はありますか?

私は数値フィールドで部分検索を実装しようとしています。

SQLスクリプトを作成する場合、別のデータ型に列を変換するのは簡単です:

SELECT Id 
FROM Employees 
WHERE CAST(Id AS VARCHAR) LIKE '%95%'; 

は、LINQクエリで同等の任意の並べ替えはありますか?

私が照会しているエンティティのデータ型を変更することはできません。Idはデモンストレーションの目的にすぎません。

+0

を多分[この](http://stackoverflow.com/questions/158634/doing-a-cast-within-a-linq-query)の質問は、あなたがに見えるかもしれません – LeeonTM

+1

お手伝いをすることができます'SqlFunctions'クラスです。これには、LINQプロバイダが直接サポートするいくつかのメソッドがあります。 'Cast'や' Convert'メソッドがあるかどうかはわかりません。 IIRC、それは 'StringConvert'を持っています – Amy

+1

そのSQLクエリは実際にはバグです。あなたがテキスト検索を行うことができるように、ビジネス上の意味を持たないIdを*文字列*に変換する必要がある場合、何かが間違っています。少なくともキャストやワイルドカードによる検索ではインデックスの使用が禁止されているため、テーブル全体をスキャンする必要があります –

答えて

4

なぜ私はToStringがうまくいかないのか分かりませんが、これは私にはうまくいきます。 SqlFunctions必要とせず:

  context.Employees.Where(emp => emp.Id.ToString().Contains("95")).ToList(); 
+0

ええ、そうです。私の悪い。 – krillgar

3

あなたがSqlFunctions.StringConvert使用することができます。

var q = db.Employees 
    .Where(emp => SqlFunctions.StringConvert((decimal) emp.Id).Contains("95")); 
1

あなたがSqlFunctions解決策を見つけることができない場合は、必ずExecuteQuery

var ids = db.ExecuteQuery<int>("SELECT Id FROM Employees WHERE CAST(Id AS VARCHAR) LIKE '%{0}%'", "95") 

あります

(これは、パラメータのために正確に正しいではないかもしれないが。)
+0

ほとんどの場合、私は同意してこれを受け入れます。しかし、私の特定のケースでは、他のフィルタリングや作業があり、手を動かすことで問題が発生する可能性があります。私はその質問には言及していないことをお詫びしますが、私は彼らに正確な問題に焦点を当てておきたいと思います。これは間違いなく他人を助けるでしょう!ありがとう。 :D – krillgar

関連する問題