为了账号安全,请及时绑定邮箱和手机立即绑定

为什么.ToList()和AsEnumerable()使我的查询区分大小写

为什么.ToList()和AsEnumerable()使我的查询区分大小写

C#
噜噜哒 2021-05-11 09:46:00
我已经实现了twitter的typeahead插件,可以在我的应用程序中自动完成表单。当查询数据库以匹配在输入框中输入的名称时,它只会匹配区分大小写的名称,但是应该提前键入不区分大小写的名称。例如:凯文·史密斯(Kevin S)暗示凯文·史密斯(Kevin Smith),但凯文·史密斯(kevin s)毫不暗示。API代码// GET: /api/authorspublic IHttpActionResult GetAuthors(string query = null){    var authorsQuery = _context.Authors.ToList().Select(Mapper.Map<Author, AuthorDto>);    if (!String.IsNullOrWhiteSpace(query))        authorsQuery = authorsQuery.Where(c => c.Name.Contains(query));    return Ok(authorsQuery);}我认为这与.ToList()的执行有关,然后才通过.Where()调用查询数据库。我将代码更改为此,现在可以正常工作// GET: /api/authorspublic IHttpActionResult GetAuthors(string query = null){    var authorsQuery = _context.Authors.AsQueryable();    if (!String.IsNullOrWhiteSpace(query))        authorsQuery = authorsQuery.Where(c => c.Name.Contains(query));    var authorsDto = authorsQuery.ToList().Select(Mapper.Map<Author, AuthorDto>);    return Ok(authorsDto);}因此,在输入“ kevin s”时,建议输入“ Kevin Smith”我尝试使用AsEnumerable而不是AsQueryable()进行操作,它的效果与原始代码相同为什么它可以与AsQuerable一起使用,但不能与其他人一起使用呢?与查询执行有关吗?
查看完整描述

1 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

我认为这与.ToList()的执行有关,然后才通过.Where()调用查询数据库。

你是对的。有了.AsQueryable(),您c => c.Name.Contains(query)就是一棵表达树。这意味着它不会转换为运行您所写内容的MSIL代码,而是会转换为您所写内容的描述。Entity Framework可以使用它来将其转换为SQL,并且在SQL中,即使在普通C#代码中区分大小写,也可能不区分大小写。

.Where做出决议Queryable.Where

我尝试使用AsEnumerable而不是AsQueryable()进行操作,它的效果与原始代码相同

使用.AsEnumerable(),即使您的查询没有立即执行,c => c.Name.Contains(query) 也可以编译为常规C#代码。

这是因为Queryable.Where无法使用(您没有IQueryable<T>),Enumerable.Where而是使用。后者不接受表达式树。


查看完整回答
反对 回复 2021-05-23
  • 1 回答
  • 0 关注
  • 154 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信