0

次の方法を機能させようとしています。

private static IQueryable<TObject> ApplyOrderBy<TObject, TKey>(IQueryable<TObject> query, OrderByDirection orderByDirection,
                                                        Expression<Func<TObject, TKey>> sortExpression, ref bool first)
{
    if (orderByDirection == OrderByDirection.None || sortExpression == null) return;
    if (orderByDirection != OrderByDirection.Ascending && orderByDirection != OrderByDirection.Descending)
        throw new Exception(string.Format("Should never get here! Unknown OrderByDirection enum - '{0}'.", orderByDirection));

    if (first)
    {
        first = false;
        query = orderByDirection == OrderByDirection.Ascending
                    ? query.OrderBy(sortExpression)
                    : query.OrderByDescending(sortExpression);
    }
    else
    {
        query = orderByDirection == OrderByDirection.Ascending
                    ? ((IOrderedQueryable<TObject>)query).ThenBy(sortExpression)
                    : ((IOrderedQueryable<TObject>)query).ThenByDescending(sortExpression);
    }

    return query;
}

このメソッドは、次のように呼び出すとうまく機能します。

ApplyOrderByToGet(ref query, OrderByDirection.Ascending, x => x.StartDateTime, ref first);

並べ替え式に​​は、型として厳密に型指定された DateTime があり、LINQ to SQL は問題ありません。ただし、これらの式の配列をさまざまな型で渡したい場合は、最終的に型として「オブジェクト」を含むリストが必要です。問題は、LINQ to SQL が型がオブジェクトではなく、DateTime であることを認識しないことです。これは、LINQ to objects を使用した通常のリストで機能します。式ツリーをナビゲートして型を調べることは可能ですが、ApplyOrderBy を呼び出す前に式をキャスト/変換することは可能でしょうか?

キャストまたは変換:

Expression<Func<T, object>>

に:

Expression<Func<T, DateTime>>
4

0 に答える 0