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

我已经实现了twitter的typeahead插件,可以在我的应用程序中自动完成表单。


当查询数据库以匹配在输入框中输入的名称时,它只会匹配区分大小写的名称,但是应该提前键入不区分大小写的名称。


例如:凯文·史密斯(Kevin S)暗示凯文·史密斯(Kevin Smith),但凯文·史密斯(kevin s)毫不暗示。


API代码


// GET: /api/authors

public 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/authors

public 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一起使用,但不能与其他人一起使用呢?与查询执行有关吗?


噜噜哒
浏览 155回答 1
1回答

潇潇雨雨

我认为这与.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)&nbsp;也可以编译为常规C#代码。这是因为Queryable.Where无法使用(您没有IQueryable<T>),Enumerable.Where而是使用。后者不接受表达式树。
打开App,查看更多内容
随时随地看视频慕课网APP