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))
Foi útil?

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
scroll top