Pregunta

Tengo la 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 gridsortopciones y las clases PagedViewModel son de MVCContrib, ya que la vista está usando La cuadrícula de MVCCONTRIB para mostrar los datos.
  • Conn es un SQLConnection estándar que habla con una base de datos de SQL Server.
  • Conn.Qery es un método de extensión SQLConnection proporcionado por DAPPER que estoy usando para obtener los datos.
  • La propiedad de consulta que se está llenando en el PagedViewModel es un tipo iQeryable

    Si la palabra Wildword funciona bien, pero tan pronto como agrega una palabra de búsqueda, la cuadrícula MVCCONTRIB se cae con una "referencia de objeto no establecida en un error de un objeto".Funciona si quito el .Contains) desde el método AddFilter como este:

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

    Alguien conozca un camino alrededor de esto, o por qué no puedo usar contiene con la dapper Iqueryable?

    gracias

    Editar:

    Gracias a la respuesta de Sam, esto lo arregla:

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

¿Fue útil?

Solución

Este no es realmente un problema de Dapper.

Tiene una colección de objetos, algunos de ellos tienen propiedades null y está tratando de golpearlas con un .Contains

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top