Linq to sql 区分大小写的C#LINQ问题

Linq to sql 区分大小写的C#LINQ问题,linq-to-sql,c#-3.0,Linq To Sql,C# 3.0,我有这个: var sortName = Request.Params["sortName"]; var query = Request.Params["query"]; Func<UsuarioEndereco, bool> whereClause = (uen => uen.GetPropValue<string>(sortName).Contains(query)); 但是,我对LINQ区分大小写的搜索有问题。如果我输入“Joe”,我会得到一些东西。另一方

我有这个:

var sortName = Request.Params["sortName"];
var query = Request.Params["query"];

Func<UsuarioEndereco, bool> whereClause = (uen => uen.GetPropValue<string>(sortName).Contains(query));
但是,我对LINQ区分大小写的搜索有问题。如果我输入“Joe”,我会得到一些东西。另一方面,如果我输入“joe”,它不会带来任何东西

如何使此“Contains(sortName)”不区分大小写??我尝试过使用String.Comparer进行一些操作,但它会在生成解决方案时报告错误


谢谢

我相信以下内容将生成正确的SQL:

 uen=>(uen.GetPropValue<string>(sortName)).ToLower().Contains(query.ToLower()))
uen=>(uen.GetPropValue(sortName)).ToLower()包含(query.ToLower())

如果这确实是LINQ to SQL,请尝试使用该方法而不是String.Contains

但是,我认为问题在于这不是LINQ到SQL,因为您使用的是委托而不是表达式树。因此,这被带到客户端,然后在本地执行(“LINQ到对象”)。因此,String.Contains正在做它在本地所做的事情


这样,James的答案是正确的,因为他对值和查询都调用了ToLower()。(尽管如此,请注意区域性问题——可能需要指定所需的区域性。)

以下是完整的代码:

var sortOrder    = Request.Params["sortorder"];    
var sortName     = Request.Params["sortname"];
var query        = Request.Params["query"];

IEnumerable<UsuarioEndereco> pagedEndereco;

Func<UsuarioEndereco, bool> whereClause = (uen => uen.GetPropValue<string>(sortName).Contains(query));
pagedEndereco = sortOrder.Equals("asc", StringComparison.CurrentCultureIgnoreCase) ?
                        _agendaServico.SelecionaUsuarioEnderecos(u.codUsuario).Where(whereClause).OrderByDescending(uen => uen.GetPropValue<IComparable>(sortName)) :
                        _agendaServico.SelecionaUsuarioEnderecos(u.codUsuario).Where(whereClause).OrderBy(uen => uen.GetPropValue<IComparable>(sortName));
var sortOrder=Request.Params[“sortOrder”];
var sortName=Request.Params[“sortName”];
var query=Request.Params[“query”];
IEnumerable pagedEndereco;
Func whereClause=(uen=>uen.GetPropValue(sortName).Contains(query));
pagedEndereco=sortOrder.Equals(“asc”,StringComparison.CurrentCultureInogoreCase)?
_agendaServico.seleconausuarioenderecos(u.codUsuario).Where(Where子句).OrderByDescending(uen=>uen.GetPropValue(sortName)):
_agendaServico.selecionausarioenderecos(u.codUsuario).Where(Where子句).OrderBy(uen=>uen.GetPropValue(sortName));
扩展方法GetPropValue为:

public static T GetPropValue<T>(this object component, string propertyName)
{
    return (T)TypeDescriptor.GetProperties(component)[propertyName].GetValue(component);
}
public static T GetPropValue(此对象组件,字符串propertyName)
{
返回(T)TypeDescriptor.GetProperties(组件)[propertyName].GetValue(组件);
}

您还可以使用String.IndexOf方法(String,Int32,StringComparison)()。此方法允许您指定是否应区分大小写进行匹配,以及是否应使用不变区域性

在你的例子中:

Func<UsuarioEndereco, bool> whereClause = (uen => uen.GetPropValue<string>(sortName).IndexOf(query, 0, StringComparison.OrdinalIgnoreCase));
Func-whereClause=(uen=>uen.GetPropValue(sortName.IndexOf(query,0,StringComparison.OrdinalIgnoreCase));

我不会评论这是否比詹姆斯·科伦提供的解决方案更好。就性能而言,它可能是,也可能不是。

James,它不起作用,因为只有在数据库中的记录被记录在lowerleters(例如,joe)中时,它才会起作用。例如:在我的数据库中,我记录了“Joe”。如果我在页面中键入“Joe”,它将显示结果。如果我输入“joe”,它将不会显示任何内容,因为它区分大小写。这就是为什么我要在包含()的两侧下方输入()哦,伙计!很抱歉我以前没见过托洛尔!!它工作得很好!谢谢!!注意这段代码,因为在带有重音符号的语言中,您可能也希望删除它们(例如,为其创建一个扩展方法并在.ToLower()之前调用)。您可以在LINQ to SQL中使用这种反射?对不起,我以为它是LINQ to SQL,但它不是,因为它不是一个表达式,只是一个Func。起初,我很惊讶地看到“GetPropValue”能够转换为SQL:)如果可能重复,请将此移到您的问题中。
Func<UsuarioEndereco, bool> whereClause = (uen => uen.GetPropValue<string>(sortName).IndexOf(query, 0, StringComparison.OrdinalIgnoreCase));