基本上,这有效:
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行时,我会得到超时异常)
答案 0 :(得分:0)
L2E始终使用带有非常量值的SQL参数来防止SQL注入攻击。
但是,正如您所见,数据库服务器也不能始终优化参数化查询。
但是,Entity SQL没有这样的限制,因此您可以编写ESQL查询。
或者,映射proc,view或使用ObjectContext.ExecuteStoreCommand。
您还可以更改数据库架构以存储可直接比较的值。
顺便说一句,I consider mapping the ASP.NET membership tables to be a bad idea.
编辑:还有一件事要尝试......
from membershipUser in context.MembershipUsers
from user in context.Users
where membershipUser.UserName == user.UserName
|| membershipUser.UserName == usernamePrefix + user.UserName
select ...