Utilisation de Contains () sur un IQueryable construit avec Dapper (avec MVCContrib Grid)

dapper iqueryable linq mvccontrib-grid

Question

J'ai le ActionResult suivant dans un projet 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);
}
  • Les classes GridSortOptions et PagedViewModel proviennent de MVCContrib car la vue utilise la grille de MVCContrib pour afficher les données.
  • conn est un standard SQLConnection parlant à une base de données SQL Server.
  • conn.Query est une méthode d'extension SQLConnection fournie par Dapper que j'utilise pour obtenir les données.
  • La propriété Query en cours de remplissage dans PagedViewModel est un type IQueryable

Si searchWord est null, tout fonctionne bien, mais dès que vous ajoutez un searchWord, la grille MVCContrib tombe avec une erreur "Référence d'objet non définie à une instance d'objet". Cela fonctionne si je supprime les .Contains) de la méthode AddFilter comme ceci:

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

Quelqu'un sait-il comment contourner ce problème ou pourquoi je ne peux pas utiliser Contient avec le Dapper IQueryable?

Merci

Modifier:

Grâce à la réponse de Sam, cela résout le problème:

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

Réponse acceptée

Ce n'est pas vraiment un problème de Dapper.

Vous avez une collection d'objets, certains d'entre eux ont null propriétés null et vous essayez de les .Contains avec un .Contains

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



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi