El uso de contiene () en un IQueryable construido con DAPPER (con MVCContrib Grid)
-
14-11-2019 - |
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))
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