Usando Contains() em um IQueryable construído com Dapper (com MVCContrib Grid)
-
14-11-2019 - |
Pergunta
Eu tenho o seguinte ActionResult em um projeto ASP.NET MVC 3:
public ActionResult Index(string searchWord, GridSortOptions gridSortOptions, int? page)
{
var userListModel = new PagedViewModel<UserModel>
{
ViewData = ViewData,
Query = conn.Query<UserModel>("select Id, Login, Firstname, Lastname from User").AsQueryable(),
GridSortOptions = gridSortOptions,
DefaultSortColumn = "Id",
Page = page,
PageSize = 20
}
.AddFilter("searchWord", searchWord, u => u.Login.Contains(searchWord) || u.Firstname.Contains(searchWord) || u.Lastname.Contains(searchWord))
.Setup();
return View(userListModel);
}
- As classes GridSortOptions e PagedViewModel são do MVCContrib como o modo de exibição está usando a grade do MVCContrib para exibir os dados.
- conn é um SQLConnection padrão conversando com um banco de dados SQL Server.
- conn.Query é um método de extensão SQLConnection fornecido pelo Dapper que estou usando para obter os dados.
- A propriedade Query que está sendo preenchida no PagedViewModel é do tipo IQueryable
Se searchWord for nulo, tudo funcionará bem, mas assim que você adicionar um searchWord, a grade MVCContrib cairá com um erro 'Referência de objeto não definida para uma instância de um objeto'.Funciona se eu remover .Contains) do método AddFilter assim:
.AddFilter("searchWord", searchWord, u => u.Login == searchWord)
Alguém sabe como contornar isso ou por que não consigo usar Contém com o Dapper IQueryable?
Obrigado
Editar:
Graças à resposta de Sam, isso resolve o problema:
.AddFilter("searchWord", searchWord, u => (!string.IsNullOrEmpty(u.Login) && u.Login.Contains(searchWord))
Solução
Este não é realmente um problema do Dapper.
Você tem uma coleção de objetos, alguns deles têm null
propriedades e você está tentando atingi-las com um .Contains
var users = new UserModel[] { new UserModel(); }
// Login is null
users.AsQueryable().where(u => u.Login.Contains("bob")); // kaboom
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow