【问题标题】:C# MVC API URL string value remove case sensitiveC# MVC API URL 字符串值删除区分大小写
【发布时间】:2016-04-24 12:03:05
【问题描述】:

我有 C# MVC API URL localhost/api/APIValues?Name=Nick。所有工作但唯一的问题是当我输入 Name=nick 它不会显示结果。因为我的数据库表名字段存储尼克。我的数据库表名字段也有一些数据示例 Nick、ANN、tristan、Abbott、BUD。如何删除字符串(名称)区分大小写的 MVC API 值? 例如,如何设置两种工作方式 localhost/api/APIValues?Name=Nick 和 localhost/api/APIValues?Name=nick。

这是我的 C# 代码。

public IEnumerable<NameDTO> Get(string Name = "")
{
var nameList = (from o in db.People.AsEnumerable()
                       where  o.name == Name                       
                       join s in db.Employee on
                        o.empID equals s.empID
                     
                        select new 
                        {
                            
                           s.empID,
                            o.Id
                        }).ToList();
}

我的最终输出应该可以使用两个名称“尼克或尼克”

localhost/api/APIValues?Name=Nick
localhost/api/APIValues?Name=nick

【问题讨论】:

  • ToLower(o.name) == ToLower(Name) 是一个选项吗?
  • 有人输入了 ANN、Ann 和 Ann 怎么样?
  • 你在使用实体框架吗?或者在这种情况下 db 是什么?
  • 是的,我正在使用 EF、MVC 5 和 MSSQL 2012

标签: c# asp.net-mvc asp.net-mvc-4


【解决方案1】:

您可以使用等于StringComparison

public IEnumerable<NameDTO> Get(string Name = "")
{
var nameList = (from o in db.People.AsEnumerable()
                       where o.name.Equals(Name, StringComparison.OrdinalIgnoreCase)      
                       join s in db.Employee on
                        o.empID equals s.empID

                        select new 
                        {

                           s.empID,
                            o.Id
                        }).ToList();
}    

【讨论】:

  • 如果我添加这一行 o.name.Equals(Name, StringComparer.OrdinalIgnoreCase) 它会说 Member 'object.Equals(object, object)' cannot be access with an instance reference;改为使用类型名称来限定它
  • 使用:StringComparison.OrdinalIgnoreCase
  • 对不起,我不清楚使用StringComparison,我该怎么做?
  • 没有任何错误,但仍然只有 Ann 工作,如果我输入 ann,它将无法工作
  • 你在使用 StringComparison.OrdinalIgnoreCase 吗?
【解决方案2】:

试试这个,我想它可能对你有帮助:

    // Use if you want same records  with name you provide

    public List<NameDTO> Get(string Name = "")
    {
        var nameList = (from o in db.People.AsEnumerable()
                        where o.name.Trim().ToLower() == Name.Trim().ToLower()
                        join s in db.Employee on
                         o.empID equals s.empID

                        select new NameDTO()
                        {
                          EmpId =  s.empID,
                           Id = o.Id
                        }).ToList();
    }

    //use this if you want similar records from database

    public IEnumerable<NameDTO> Get(string Name = "")
    {
        var nameList = (from o in db.People.AsEnumerable()
                        where o.name.Trim().ToLower().Contains(Name.Trim().ToLower())
                        join s in db.Employee on
                         o.empID equals s.empID
                       select new NameDTO()
                        {
                          EmpId =  s.empID,
                           Id = o.Id
                        }).ToList();
    }

}

【讨论】:

  • 删除大小写敏感(o.name.Trim().ToLower() == Name.Trim().ToLower()) 唯一的问题是某些正文类型 localhost/api/APIValues?Name =a 还根据“a”结果显示所有名称。如何字符串值集类型最少 3 个字母
  • 删除 AsEnumerable() 然后尝试设置字符串值的最小长度对文本框进行验证
  • 我无法删除我的 API 需要的 AsEnumerable()
【解决方案3】:

让它尽可能简单。每当我的查询不能在一行中工作时,我倾向于将其分解为几个组件。不过,我很高兴能写一篇衬里。

var nameList= db.People.AsEnumerable();
            People people = new People();
            foreach (var x in nameList)
            {
                var result = x.name.ToLower() == Name.ToLower();
                if (result)
                {
                    people = x;
                }
            }

var Employee =  db.Employee.FirstOrDefault(e => e.EmpId == people.EmpId);

NameDTO nameDTO = new NameDTO()
{
 EmpId = Employee.EmpId,
 Id = People.Id
};

【讨论】:

    【解决方案4】:

    SQL 不区分大小写。只要您使用将代码转换为 SQL 的库(例如 EF),这应该不是问题。

    var nameList = (from o in db.People
                           where  o.name == Name                       
                           join s in db.Employee on
                            o.empID equals s.empID
                            select new 
                            {                            
                               s.empID,
                                o.Id
                            }).ToList();
    

    问题在于您使用的是 AsEnumerable() ,它实际执行查询,然后比较内存中的对象,而不是在 DB 中进行比较。在 SQL Profiler 中观察它,您会发现其中的不同。

    【讨论】:

      猜你喜欢
      • 2022-11-22
      • 2010-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 2016-07-23
      • 2016-04-02
      相关资源
      最近更新 更多