2016-10-15 7 views
0

は、私はこのようなSQLクエリを持っています:スプリット

var query = (from dd in db.Departments 
      where (
       from D in db.Departments 
       join DP in db.DepartmentPersonnels on D.ID equals DP.DepartmentID 
       join P in db.Personnels on DP.PersonneID equals P.ID 
       where P.UserName == Username 
       select D.Code.Split(',').First()).Contains(dd.Code) 
      select dd).FirstOrDefault(); 

しかし、私はこのエラーを取得する:

LINQ to Entities does not recognize the method 'System.String[] Split(Char[])' method, and this method cannot be translated into a store expression. 

この問題を解決するために多くの記事を読んでいますが、この問題を解決したものはありません。

誰かがこの問題の解決方法を説明できると非常に役に立ちます。

答えて

2

明らかに、string.Splitメソッドは、LINQ to Entitiesではサポートされていません。

幸いなことに、疑問

SUBSTRING(Code, 0, CHARINDEX(',', Code)) 

でのSQL式はSubstringIndexOfを使用して直接LINQ同等サポートされています(string引数でオーバーロードを)持っています。

ので

D.Code.Substring(0, D.Code.IndexOf(",")) 

D.Code.Split(',').First() 

を置き換えるしかし、上記の式の翻訳がターゲット文字列が内部「」含まれていない場合には安全ではありませんのでご注意下さい。 dd.ID上db.DepartmentPersonnelsにDPに参加DP.DepartmentID 等しいdb.DepartmentsにDDから(=

where P.UserName == Username && D.Code.IndexOf(",") >= 0 
+0

Thanks.Iがクエリ 'の下にクエリを使用:だからにwhere句を変更することも必要になる場合がありますDP.PersonneIDのPをdb.Personnelsに登録すると、P.ID となります。P.UserName ==ユーザ名 ddを選択します).FirstOrDefault(); string Code = query.Code.Split( '、')[0]; result =(dのdb.Departments ここでd.Code == Code select d).FirstOrDefault(); 'パフォーマンスの面でより優れていますか? –

+0

ええ、サブクエリが単一のレコードを返すことになっている場合、これは実行可能な解決策です。パフォーマンスはどうですか、あなたはそれをチェックしなければなりません(そういう人は普通、馬を走らせます:) –