Linq to Entities: Как передать параметр в строку Содержит метод в соединении? - PullRequest
1 голос
/ 17 июня 2011

В основном это работает:

from membershipUser in context.MembershipUsers
join user in context.Users on membershipUser.UserName equals (user.UserName.Contains("partner:") ? user.UserName.Replace("partner:", "") : user.UserName)

Но это не так:

var usernamePrefix = "partner:";
...
from membershipUser in context.MembershipUsers
join user in context.Users on membershipUser.UserName equals (user.UserName.Contains(usernamePrefix) ? user.UserName.Replace(usernamePrefix, "") : user.UserName

Я получаю исключение тайм-аута.

Единственное отличие в сгенерированных сценариях SQL заключается в том, что первый из них отображает:

LIKE N'%partner:%'

В то время как последний делает:

LIKE '%partner:%' /* @p__linq__3 */ ESCAPE N'~'

(Оба сценария SQL работают при запуске в Management Studio)

Есть мысли?

(ОБНОВЛЕНИЕ: я видел, что с небольшим количеством строк оба способа работают, но когда я нажимаю более 1000 строк, я получаю исключение тайм-аута)

1 Ответ

0 голосов
/ 17 июня 2011

L2E всегда использует параметр SQL с непостоянными значениями для защиты от атак внедрения SQL.

Однако, как вы видели, сервер БД не всегда может оптимизировать параметризованные запросы.

Однако Entity SQL не имеет таких ограничений, поэтому вы можете написать запрос ESQL.

Альтернативно, сопоставьте proc, просмотрите или используйте ObjectContext.ExecuteStoreCommand.

Вы также можете изменить схему БД для хранения значения, которое можно сравнивать напрямую.

Кстати, Я считаю отображение таблиц членства ASP.NET плохой идеей.

Редактировать: Еще одна вещь, чтобы попробовать ...

from membershipUser in context.MembershipUsers
from user in context.Users
where membershipUser.UserName == user.UserName
     || membershipUser.UserName == usernamePrefix + user.UserName
select ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...