だから私の問題はこのようなものです。C#コードでは、入力パラメーターに応じて、LinqtoEntitiesを使用してエンティティセットの複数の順序付けを実行する必要があります。注文する列は3つあり、注文する列の順序自体は可変です(つまり、注文するたびに、注文する列を検索する必要があります)。どうすればこれを達成できますか?
動作するはずのコードがいくつかありますが、操作をパラメーター化できなかったため、繰り返しすぎています(Linq to Entitiesは、ラムダで許可されていることに対して非常に制限されています)。おそらくT4コード生成の助けを借りて、 DRYの原則に従ってコードを書き直す方法を提案してください。
次のコードは私の問題を説明するはずです。これは実際のコードの抜粋です。簡潔にするために、さらに含める必要があるかどうかをお知らせください。変数は「順序指定」のorderSpecs
配列であり、それぞれが順序付けする列と降順で順序付けするかどうかを指定します。orderSpecs
配列には少なくとも1つの要素があるため、少なくとも1つの順序付けが実行されます。
using (var db = new MyContainer())
{
var orderSpec = orderSpecs[0];
IQueryable<DbVersion> dVersions = null;
if (orderSpec.Column == 0)
{
if (orderSpec.Descending)
{
dVersions = db.Versions.OrderByDescending(ver => ver.Name);
}
else
{
dVersions = db.Versions.OrderBy(ver => ver.Name);
}
}
else if (orderSpec.Column == 1)
{
if (orderSpec.Descending)
{
dVersions = db.Versions.OrderByDescending(ver => ver.Built);
}
else
{
dVersions = db.Versions.OrderBy(ver => ver.Built);
}
}
else if (orderSpec.Column == 2)
{
if (orderSpec.Descending)
{
dVersions = db.Versions.OrderByDescending(ver => ver.Id);
}
else
{
dVersions = db.Versions.OrderBy(ver => ver.Id);
}
}
foreach (var spec in orderSpecs.Skip(1))
{
if (spec.Column == 0)
{
if (spec.Descending)
{
dVersions = dVersions.ThenByDescending(ver => ver.Name);
}
else
{
dVersions = dVersions.ThenBy(ver => ver.Name);
}
}
else if (spec.Column == 1)
{
if (spec.Descending)
{
dVersions = dVersions.ThenByDescending(ver => ver.Built);
}
else
{
dVersions = dVersions.ThenBy(ver => ver.Built);
}
}
else if (spec.Column == 2)
{
if (spec.Descending)
{
dVersions = dVersions.ThenByDescending(ver => ver.Id);
}
else
{
dVersions = dVersions.ThenBy(ver => ver.Id);
}
}
}