Разделение на вложенные из в Entity Framework

#sql-server #entity-framework

#sql-сервер #entity-framework

Вопрос:

У меня есть 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.
 

Я прочитал много сообщений, чтобы решить эту проблему, но ни один из них не решил эту проблему.

Было бы очень полезно, если бы кто-нибудь мог объяснить решение этой проблемы.

Ответ №1:

По-видимому string.Split , метод не поддерживается в LINQ to Entities.

К счастью, рассматриваемое выражение SQL

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

имеет прямой эквивалент LINQ, использующий Substring и IndexOf (перегрузки с string аргументом), которые поддерживаются.

Поэтому замените

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

с

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

Но, пожалуйста, обратите внимание, что перевод приведенного выше выражения небезопасен, если целевая строка не содержит «,» внутри. Поэтому вам может потребоваться также изменить where предложение на:

 where P.UserName == Username amp;amp; D.Code.IndexOf(",") >= 0
 

Комментарии:

1. Спасибо. Я использовал запрос ниже query=(from dd in db.Departments join DP in db.DepartmentPersonnels on dd.ID equals DP.DepartmentID join P in db.Personnels on DP.PersonneID equals P.ID where P.UserName==Username select dd).FirstOrDefault(); string Code = query.Code.Split(',')[0]; result=(from d in db.Departments where d.Code==Code select d).FirstOrDefault(); . Лучше ли это с точки зрения производительности?

2. Хм, если предполагается, что подзапрос возвращает одну запись, то это жизнеспособное решение. Что касается производительности, вы должны это проверить (как обычно говорят люди в SO, запускайте лошадей 🙂