ユーザー入力に基づいて動的にLINQクエリを作成しており、ユーザーが文字列strとフィールドfooに基づいてレコードrを検索している場合(str.Contains(r.foo))を処理したいと思います。さて、その逆(r.foo.Contains(str))は単純ですが、LINQはそれを逆に行うことについて私に悲しみを与えています。
これが私がこれまでに持っているものです:
private Expression SqlNotIn(Expression left, Expression right)
{
return Expression.Equal(
Expression.Call(
null,
typeof(SqlFunctions).GetMethod("CharIndex", BindingFlags.Static | BindingFlags.Public, null, new[] { typeof(string), typeof(string) }, null),
new[] { right, left }
),
Expression.Constant(0)
);
}
Expression
left
これは、プロパティアクセサである、、Expression
right
および検索する文字列の定数である、を取り、Expression
(本質的に)を表すを返すことになってい(SqlFunctions.CharIndex(right, left) == 0)
ます。これを実行すると、「バイナリ演算子Equalは型'System.Nullable 1[System.Int32]' and 'System.Int32'." Explicitly casting the
0 to
int?`に対して定義されていません。as式を使用すると、LINQがクエリを早期に実行するように見えます。
これを行う簡単な方法はありますか?
編集:
private Expression SqlNotIn(Expression left, Expression right)
{
return Expression.Equal(
Expression.Call(
right,
typeof(string).GetMethod("IndexOf", new[] { typeof(string) }),
new[] { left }
),
Expression.Constant(-1)
);
}
これは機能しますが、生成されるSQLは次のようになります。
(CASE
WHEN DATALENGTH([t0].[Destination]) = 0 THEN 0
ELSE CHARINDEX([t0].[Destination], @p0) - 1
END) = @p1
できればCharIndexを使用できれば幸いです。