1

動的な 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 アイテムを配置するにはどうすればよいですか?

4

1 に答える 1