2017-04-14 18 views
0

SQLからデータを選択するために、LINQ to Entitiesを使用しています。メソッドがLINQストア式でサポートされていません

は、ここで私は、私は特殊文字なしの比較の両側を比較するために書いたRemoveSpecialCharactersメソッドを使用しています、私の文

var employee = from p in _context.employee 
         select p; 

employee = employee.Where(p => 
Helper.RemoveSpecialCharacters(p.IdentificationNumber). 
Equals(Helper.RemoveSpecialCharacters(search.IdentificationNumber))); 

var Results = employee.ToList(); 

です。

ここで私はエラーが発生します。 "RemoveSpecialCharacters"メソッドはLinq-> Entityではサポートされておらず、有効なストア式ではありません。

私はそれをSQLとして翻訳することはできません。しかし、LINQを使ってどのように比較するのですか?

RemoveSpecialCharacters方法

public static string RemoveSpecialCharacters(string str) 
    { 
     char[] arr = str.Where(c => (char.IsLetterOrDigit(c))).ToArray(); 

     str = new string(arr); 

     return str; 
    } 

methodNameのは、多分、SQLはそれを理解しているように、私は、LINQでこれを置くことができますどのようにLINQストアに翻訳する場合。

+1

ところで、「var employee =(_context.employee);」(C#言語仕様バージョン5.0,7.16.2.5節の選択)では、「var employee = from _context.employee select p; 。 – Philippe

+0

理想的には、IQueryableクエリを動作させるためにMethodCall式を作成することができます。式ツリーから 'Func'をコンパイルするときにメソッドを翻訳できません。 –

+0

' Regex.Replace'を使用してコードをチェックしてください –

答えて

2

あなたはSQLであなたのRemoveSpecialCharactersを表現することができた場合は、計算されたIdentificationNumberWithoutSpecialCharacters列を使用して、従業員を提示するSQLビューを持っているし、それに基づいてフィルタリングできます。

また、SQL Server用の.NETアセンブリを作成して、このメソッドのC#実装を再利用することもできます。

+0

Sqlで 'RemoveSpecialCharacters'を表現するには、この部分に答えてください.Sql CLRまたはDynamic Sqlはデータサイズが増えるにつれてパフォーマンスが良くないオプションです。コードなしでは、これは答えよりもコメントの方が多いはずです –

0

あなたの最初のDBクエリオフ.ToList()仕上げ、そしてあなたと協力し、あなたのオブジェクトに変更するための メモリー内表現を提供します。

var employee = from p in _context.employee 
         select p.ToList(); 
string searchIdent = Helper.RemoveSpecialCharacters(search.IdentificationNumber); 

employee = employee.Where(p => 
Helper.RemoveSpecialCharacters(p.IdentificationNumber). 
Equals(searchIdent)); 

var Results = employee; 
+4

これは、フィルタリングする前に、全従業員テーブルをメモリにプルします。 – Philippe

+0

うん、何かしたくない。 –

+1

テーブル全体を引っ張っても唯一の解決策であっても、 '.ToList()'を '.AsEnumerable()'に置き換えてリストを作成せず、破棄されたオブジェクトをメモリに保存します。 – Philippe

0

LINQの

のために必要な、照会可能なプロバイダは、クエリ式にメソッドの呼び出しを変換する方法を知らないように、現在のコードは問題があり、主にそれはあなたが使用し Linq to Entitiesプロバイダが正しい表現に変換されるだろう、 Regex.Replaceの使用を検討してください

正規表現

Regex regex = new Regex("[^a-zA-Z0-9]");

修正コード

var employee = from p in _context.employee select p; 

employee = employee.Where(p => 
regex.Replace(p.IdentificationNumber,""). 
Equals(regex.Replace(search.IdentificationNumber,""))); 

var Results = employee.ToList(); 
関連する問題