0

私は動的orderByを行うためにlinq動的を使用しています。順序比較可能な型を持つ必要があるエンティティのプロパティ名のみを取得するにはどうすればよいですか。エンティティには、基本型 (文字列、int) と、ユーザーがフィルター処理できない複雑なオブジェクトがあります。

var OrderByOptions = typeof (Project).GetProperties().Select(x => x.Name).ToList(); //I only want order comparable property names here

var userSelectable = 2;

var pjs = _pjRepo.Projects.Where(x => x.Active == true).OrderBy(OrderByOptions[userSelectable]).ToList();
4

2 に答える 2

3

これは、両方を処理したい場合IComparableIComparable<>

var OrderByOptions = (from p in typeof(Project).GetProperties()
                      let type = p.PropertyType
                      where typeof(IComparable).IsAssignableFrom(type) || 
                            typeof(IComparable<>).MakeGenericType(type).IsAssignableFrom(type)
                      select p.Name).ToArray();

IComparableサーバー側の順序付けを行っている場合、 /IComparable<T>が SQL で同じになるという保証はないことに注意してください。例えば:

bool b1 = typeof(IComparable).IsAssignableFrom(typeof(int?));
bool b2 = typeof(IComparable<int?>).IsAssignableFrom(typeof(int?));

どちらも false を返します。しかし、nullable int は SQL で確実に匹敵します。

おそらくホワイトリストの方が良いでしょう。

public static readonly HashSet<Type> ComparableTypes = new HashSet<Type>
{
    typeof(bool), typeof(bool?),
    typeof(char), typeof(char?),
    typeof(string),
    typeof(sbyte), typeof(sbyte?), typeof(byte), typeof(byte?),
    typeof(short), typeof(short?), typeof(ushort), typeof(ushort?),
    typeof(int), typeof(int?), typeof(uint), typeof(uint?),
    typeof(long), typeof(long?), typeof(ulong), typeof(ulong?),
    typeof(float), typeof(float?),
    typeof(double), typeof(double?),
    typeof(decimal), typeof(decimal?),
    typeof(DateTime), typeof(DateTime?),
    typeof(DateTimeOffset), typeof(DateTimeOffset?),                
    typeof(TimeSpan), typeof(TimeSpan?),
    typeof(Guid), typeof(Guid?),
};

var OrderByOptions = (from p in typeof(Project).GetProperties()
                      let type = p.PropertyType
                      where ComparableTypes.Contains(type)
                      select p.Name).ToArray();
于 2013-08-20T09:36:08.983 に答える
1

サポートするすべてのクラスとその汎用バージョンorder comparabilityを実装する必要があると思います:IComparable

var OrderByOptions = typeof (Project).GetProperties()
                                     .Where(p=>typeof(IComparable).IsAssignableFrom(p.PropertyType))
                                     .Select(x => x.Name).ToList();
于 2013-08-20T09:32:19.597 に答える