動的な Linq を使用して、渡された列に応じて結果セットを並べ替えています。これを使用して、ユーザーがテーブルの列をクリックしたときにテーブルを並べ替えています。
注文するプロパティがnullのクラスである場合、コードは失敗します。文字列で動的に注文できるようにしたいのですが、プロパティがクラスの場合はnullに対応したいと考えています。
これは、使用している System.Linq.Dynamic クラスのコードです。
public static IQueryable OrderBy(this IQueryable source, string ordering,
params object[] values)
{
if (source == null) { throw new ArgumentNullException("source"); }
if (ordering == null) { throw new ArgumentNullException("ordering"); }
ParameterExpression[] parameters = new ParameterExpression[1]
{
Expression.Parameter(source.ElementType, "")
};
IEnumerable<DynamicOrdering> enumerable = new ExpressionParser(
parameters, ordering, values).ParseOrdering();
Expression expression = source.Expression;
string str1 = "OrderBy";
string str2 = "OrderByDescending";
foreach (DynamicOrdering dynamicOrdering in enumerable)
{
expression = (Expression) Expression.Call(typeof (Queryable),
dynamicOrdering.Ascending ? str1 : str2, new Type[2]
{
source.ElementType,
dynamicOrdering.Selector.Type
}, new Expression[2]
{
expression,
(Expression) Expression.Quote((Expression) Expression.Lambda(
dynamicOrdering.Selector, parameters))
});
str1 = "ThenBy";
str2 = "ThenByDescending";
}
return source.Provider.CreateQuery(expression);
}
そしてそれをこのように呼び出します
if (property.PropertyType == typeof(Sitecore.Data.Items.Item))
{
orderByProperty = property.Name + ".Name";
}
else
{
orderByProperty = property.Name;
}
return tableOrder == TableOrder.az
? projects.OrderBy(orderByProperty + " ascending").ToList()
: projects.OrderBy(orderByProperty + " descending").ToList();
プロパティはクラスの場合があります。その場合は、クラスの name というフィールドで注文できるようにしたいです。上記のコードは機能しますが、プロパティがクラスで null の場合は失敗します。
フィールドで並べ替え、最後に null アイテムを配置するにはどうすればよいですか?