C# 如何在自定义Linq扩展方法中使用StringComparer?

C# 如何在自定义Linq扩展方法中使用StringComparer?,c#,linq,linq-to-entities,C#,Linq,Linq To Entities,我的项目正在为orderby、ThenBy等使用一些用户定义的linq扩展方法,我希望通过忽略其大小写,根据对象中的字符串属性对对象列表进行排序 代码: 公共静态IOrderedQueryable OrderUsingSortExpression(此IQueryable源代码,字符串sortExpression),其中tenty:class { OrderedQueryable结果=null; 尝试 { 结果=source.OrderBy(“标题”) //我在这里得到一个例外结果。 } 捕获(例

我的项目正在为orderby、ThenBy等使用一些用户定义的linq扩展方法,我希望通过忽略其大小写,根据对象中的字符串属性对对象列表进行排序

代码:

公共静态IOrderedQueryable OrderUsingSortExpression(此IQueryable源代码,字符串sortExpression),其中tenty:class
{
OrderedQueryable结果=null;
尝试
{
结果=source.OrderBy(“标题”)
//我在这里得到一个例外结果。
}
捕获(例外情况除外)
{
结果=源作为IOrderedQueryable;
}
返回结果;
}
公共静态IOrderedQueryable OrderBy(此IQueryable源,字符串字段名),其中tenty:class
{
MethodCallExpression resultExp=GenerateMethodCall(源,“OrderBy”,字段名);
将source.Provider.CreateQuery(resultExp)作为IOrderedQueryable返回;
}
私有静态MethodCallExpression GenerateMethodCall(IQueryable源、string methodName、string fieldName),其中tenty:class
{
类型=类型(强度);
类型选择器或ResultType;
var StrComp=StringComparer.OrdinalIgnoreCase;
LambdaExpression选择器=GenerateSelector(字段名、out selector或ResultType);
MethodCallExpression resultExp=Expression.Call(typeof(Queryable)、methodName、,
新类型[]{Type,selectorResultType},
source.Expression、Expression.Quote(选择器)、Expression.Constant(StrComp));
返回结果p;
}
但最后我收到了一个例外:

静态成员=错误CS0119:“NotSupportedException”是一个类型,在给定上下文中无效


我认为,它期望的是可枚举的源,而不是可查询的源。但我无法更改源类型。如何解决此问题?

Linq to SQL
将您的
Linq
查询转换为
SQL
字符串之间的比较类型完全取决于您的数据库联盟设置。实体框架(完整和核心)和Linq to SQL都不支持设置排序规则(如何比较字符串)通过
StringComparer
和类似方法。请注意,在SQL Server上,通常以不区分大小写的方式搜索列(请参阅)您能否提供一个包含显示该错误的调用?@nvoigt我有问题的代码,请检查。
public static IOrderedQueryable<TEntity> OrderUsingSortExpression<TEntity>(this IQueryable<TEntity> source, string sortExpression) where TEntity : class
        {
            OrderedQueryable<TEntity> result = null;
            try
            {
                  result =  source.OrderBy("Title") 
                    // I'm getting an exception here in result.

            }
            catch (Exception ex)
            {
               result = source as IOrderedQueryable<TEntity>;
            }
            return result;
        }

    public static IOrderedQueryable<TEntity> OrderBy<TEntity>(this IQueryable<TEntity> source, string fieldName) where TEntity : class


     {
            MethodCallExpression resultExp = GenerateMethodCall<TEntity>(source, "OrderBy", fieldName);
            return source.Provider.CreateQuery<TEntity>(resultExp) as IOrderedQueryable<TEntity>;
        }
    private static MethodCallExpression GenerateMethodCall<TEntity>(IQueryable<TEntity> source, string methodName, String fieldName) where TEntity : class
            {
                Type type = typeof(TEntity);
                Type selectorResultType;
                var StrComp = StringComparer.OrdinalIgnoreCase;
                LambdaExpression selector = GenerateSelector<TEntity>(fieldName, out selectorResultType);
                MethodCallExpression resultExp = Expression.Call(typeof(Queryable), methodName,
                                new Type[] { type, selectorResultType },
                                source.Expression, Expression.Quote(selector), Expression.Constant(StrComp));
                return resultExp;
            }