Linq to Entities:如何将参数传递给字符串包含连接中的方法?

时间:2011-06-17 17:14:24

标签: entity-framework-4

基本上,这有效:

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 :(得分: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 ...