LINQ 2 エンティティで (SQL サーバー側で) 文字列を結合したいと思います。
LINQ 2 Entity が Aggregate 関数を変換できないという事実を考えると、それは可能ですか?
(ところで、L2S が Aggregate 関数をサポートしているのに LINQ 2 Entity がサポートしていない理由がわかりません)
これを行うために式ツリーを生成しようとしましたが、これが私が思いついたものです:
ParameterExpression list = Expression.Parameter(typeof(List<string>), "list");
ParameterExpression i = Expression.Parameter(typeof(int), "i");
ParameterExpression result = Expression.Parameter(typeof(string), "r");
LabelTarget label = Expression.Label(typeof(string));
BlockExpression block = Expression.Block
(
new[] { i, result },
Expression.Assign(result, Expression.Property(list, "Item", Expression.Constant(0))),
Expression.Assign(i, Expression.Constant(0)),
Expression.Loop
(
Expression.IfThenElse
(
Expression.LessThan
(
Expression.PreIncrementAssign(i),
Expression.Property(list, "Count")
),
Expression.Assign
(
result,
Expression.Call
(
null,
typeof(string).GetMethod
(
"Concat",
new Type[]
{
typeof(string),
typeof(string),
typeof(string)
}
),
new Expression[]
{
result,
Expression.Constant(","),
Expression.Property(list, "Item", i)
}
)
),
Expression.Break(label, result)
),
label
)
);
var join = Expression.Lambda<Func<List<string>, string>>(block, list);
Response.Write(join.Compile()(new List<string> { "a", "b", "c" }));
これはうまく機能していList<string>
ます。「a、b、c」という結果が得られます。
しかし、このコードを に適用する方法がわかりませんIQueryable<string>
。
にはIQueryable<string>
"Item" プロパティがなく、IQueryable のインデックスによって要素を取得する方法がありますが、これはどのように SQL に変換されるのでしょうか?
それで、LINQ 2エンティティで(SQLサーバー側で)結合文字列タスクを達成する方法はありますか?