我已经实现了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
而是使用。后者不接受表达式树。
- 1 回答
- 0 关注
- 154 浏览
添加回答
举报
0/150
提交
取消