À l'aide de contains() sur un IQueryable construit avec Dapper (avec MVCContrib Grille)
-
14-11-2019 - |
Question
J'ai suivantes ActionResult dans un ASP.NET MVC 3 projet:
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);
}
- Le GridSortOptions et PagedViewModel classes sont de MVCContrib comme le point de vue est à l'aide de la Grille de MVCContrib pour afficher les données.
- conn est une norme SQLConnection de parler à une base de données SQL server.
- conn.La requête est une occurrence de SQLConnection méthode d'extension fournis par Dapper qui je suis aide pour obtenir les données.
- La propriété de Requête rempli dans le PagedViewModel est un IQueryable type
Si searchWord est nul tout fonctionne bien, mais dès que vous ajoutez un searchWord la MVCContrib Grille tombe dessus avec un "Objet de référence non définie à une instance d'un objet' erreur.Il fonctionne si je supprime le .Contient) à partir de la AddFilter méthode comme ceci:
.AddFilter("searchWord", searchWord, u => u.Login == searchWord)
Quelqu'un connait un moyen de contourner cela, ou pourquoi je ne peux pas utiliser Contient avec la Dapper IQueryable?
Merci
Edit:
Merci à Sam de répondre à cette fixe:
.AddFilter("searchWord", searchWord, u => (!string.IsNullOrEmpty(u.Login) && u.Login.Contains(searchWord))
La solution
Ce n'est pas vraiment une Dapper question.
Vous avez une collection d'objets, certains d'entre eux ont null
propriétés et vous essayez de frapper avec un .Contains
var users = new UserModel[] { new UserModel(); }
// Login is null
users.AsQueryable().where(u => u.Login.Contains("bob")); // kaboom
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow