2016-10-15 50 views
0

我有一個SQL查詢是這樣的:斯普利特從實體框架

select ID,DepartmentID,Code from Department 
where code in 
(select SUBSTRING(Code, 0, CHARINDEX(',', Code)) from Department as d 
inner join DepartmentPersonnel as dp on d.ID = dp.DepartmentID 
inner join Personnel as p on dp.PersonneID = p.ID 
where UserName='myUsername') 

結果這個查詢:

myTable

我試圖通過這個查詢得到這個結果EF :

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表達式有直接LINQ等效使用SubstringIndexOf被支撐(與string參數重載)。

因此,與

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

更換

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

但請注意上述表達的翻譯不是安全的情況下,目標字符串不包含「」內。所以,你可能也需要在where條款更改爲:在db.Departments

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

Thanks.I使用下面的'查詢查詢=(DD從加入 DP在dd.ID db.DepartmentPersonnels等於DP.DepartmentID 在DP.PersonneID等於P.ID 其中P.UserName ==用戶名 選擇dd).FirstOrDefault(); string Code = query.Code.Split(',')[0]; result =(從db.Departments 其中d.Code ==代碼 選擇d).FirstOrDefault();'。是否在性能方面更好? –

+0

嗯,如果子查詢應該返回單個記錄,那麼這是可行的解決方案。表演如何,你必須檢查出來(因爲人們通常說,跑馬:) –