より一般的な使用法を示すように例を更新しました。
ユーザー提供のローカリゼーションを許可するエンティティがあります。
public class ResourceValue
{
public int ResourceValueId { get; set; }
public string EnglishValue { get; set; }
public string FrenchValue { get; set; }
public string SpanishValue { get; set; }
etc...
}
次のような他の多くのエンティティで使用されます。
public class SomeEntity
{
public int Id { get; set; }
public virtual ResourceValue Name { get; set; }
public virtual ResourceValue ShortDescription { get; set; }
public virtual ResourceValue LongDescription { get; set; }
etc...
}
私はこのようなことをしたいと思います:
return context.SomeEntities.OrderBy(x => x.Name);
そして、私がこれをしたかのようにそれを機能させます:
return context.SomeEntities.OrderBy(x => x.Name.FrenchValue);
「fr-CA」である CurrentUICulture に基づいています。
Marc Gravell の回答 ( https://stackoverflow.com/a/1231941 ) に基づいていくつかのことを試してみましたが、私が望むものを完全に得ることができませんでした。
更新 - これはかなり近いですが、エンドコーダーが特別な考慮なしで使用できるように、単に「OrderBy」という名前を付けたいと思います。
public static IOrderedQueryable<TSource> OrderBy<TSource, TKey>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector)
{
return ApplyLocalizedOrder(source, keySelector, "OrderBy");
}
public static IOrderedQueryable<TSource> ApplyLocalizedOrder<TSource, TKey>(IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, string methodName)
{
ParameterExpression arg = keySelector.Parameters[0];
Expression expr = Expression.PropertyOrField(keySelector.Body, GetCurrentCulture());
LambdaExpression lambda = Expression.Lambda<Func<TSource, string>>(expr, arg);
return (IOrderedQueryable<TSource>)typeof(Queryable).GetMethods().Single(
method => method.Name == methodName
&& method.IsGenericMethodDefinition
&& method.GetGenericArguments().Length == 2
&& method.GetParameters().Length == 2)
.MakeGenericMethod(typeof(TSource), expr.Type)
.Invoke(null, new object[] { source, lambda });
}