#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')
результат этого запроса:
Я попытался получить этот результат в 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, запускайте лошадей 🙂