Usar Contains () en un IQueryable creado con Dapper (con MVCContrib Grid)

dapper iqueryable linq mvccontrib-grid

Pregunta

Tengo el siguiente ActionResult en un proyecto 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);
}
  • Las clases GridSortOptions y PagedViewModel son de MVCContrib ya que la vista está utilizando la cuadrícula de MVCContrib para mostrar los datos.
  • conn es un SQLConnection estándar que habla con una base de datos de servidor SQL.
  • conn.Query es un método de extensión SQLConnection proporcionado por Dapper que estoy utilizando para obtener los datos.
  • La propiedad Query que se completa en PagedViewModel es un tipo IQueryable

Si la palabra de búsqueda es nula, todo funciona bien, pero tan pronto como agrega una palabra de búsqueda, la cuadrícula de MVCContrib se cae con un error de "Referencia de objeto no configurada como una instancia de un objeto". Funciona si elimino los .Contains) del método AddFilter como este:

.AddFilter("searchWord", searchWord, u => u.Login == searchWord)

¿Alguien sabe cómo evitar esto o por qué no puedo usar Contiene con Dapper IQueryable?

Gracias

Editar:

Gracias a la respuesta de Sam, esto lo solucionó:

.AddFilter("searchWord", searchWord, u => (!string.IsNullOrEmpty(u.Login) && u.Login.Contains(searchWord))

Respuesta aceptada

Esto no es realmente un problema Dapper.

Tienes una colección de objetos, algunos de ellos tienen propiedades null e intentas golpearlos con un .Contains

var users = new UserModel[] { new UserModel(); } 
// Login is null 
users.AsQueryable().where(u => u.Login.Contains("bob")); // kaboom


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué