2011-06-17 4 views
1

基本的に、これは動作します:エンティティへのLinq:パラメータを文字列に渡す方法結合内のメソッドが含まれていますか?

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'~' 

(Management Studioで実行したときにどちらのSQLスクリプトが動作)

どのような考えですか?

(UPDATE:私は少数の行で両方の方法で動作しますが、私は1000の以上の行を打ったとき、私はタイムアウト例外を取得することを見てきました)

+0

それはどんな違いがありますか? –

+0

それを定数として宣言すると動作しますが、実行時にその値を変更する必要があります。 – jimmyP

+0

カラムタイプは何ですか? –

答えて

0

L2Eは常に非定数を使用してSQLのparamを使用していますSQLインジェクション攻撃に対するセキュリティのための値。

しかし、DBサーバーはパラメータ化されたクエリを最適化することはできません。

ただし、Entity SQLにはこのような制限がないため、ESQLクエリを記述できます。

また、procをマップしたり、表示したり、ObjectContext.ExecuteStoreCommandを使用したりしてください。

また、比較可能な値を直接格納するようにDBスキーマを変更することもできます。ところで

は、I consider mapping the ASP.NET membership tables to be a bad idea.

編集: `constのSTRING`として` usernamePrefix`を宣言した場合しようとするもう一つ...

from membershipUser in context.MembershipUsers 
from user in context.Users 
where membershipUser.UserName == user.UserName 
    || membershipUser.UserName == usernamePrefix + user.UserName 
select ... 
+0

確かに面白いのは、大量のデータでしか失敗しないということです。私はprocを使う必要があると思う。 – jimmyP

+0

それほど奇妙ではありません。基本的に、索引付け不可能な関数上のクロス積をやっています。しかし、私の編集でLINQを試してみてください。同じ結果が得られるはずであり、サーバー*はインデックスを作成できるかもしれません。 –

+0

編集中のLINQが機能しません。その結果、CROSS JOINはサーバーを強制終了します。 (とにかくありがとう!) – jimmyP