Verwenden von Contains () auf einem mit Dapper erstellten IQueryable (mit MVCContrib Grid)

dapper iqueryable linq mvccontrib-grid

Frage

Ich habe das folgende ActionResult in einem ASP.NET MVC 3-Projekt:

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);
}
  • Die Klassen GridSortOptions und PagedViewModel stammen von MVCContrib, da die Ansicht das Raster von MVCContrib verwendet, um die Daten anzuzeigen.
  • conn ist eine Standard-SQLConnection, die mit einer SQL Server-Datenbank kommuniziert.
  • conn.Query ist eine von Dapper gelieferte SQLConnection-Erweiterungsmethode, mit der ich die Daten abrufe.
  • Die Abfrage-Eigenschaft, die in dem PagedViewModel gefüllt wird, ist ein IQueryable-Typ

Wenn searchWord NULL ist, funktioniert alles einwandfrei, aber sobald Sie ein searchWord hinzufügen, wird das MVCContrib Grid mit einem Fehler "Objektreferenz nicht auf eine Instanz eines Objekts gesetzt" überschrieben. Es funktioniert, wenn ich die .Contains) von der AddFilter-Methode wie folgt entfernen:

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

Kennt jemand einen Weg um dies oder warum kann ich nicht mit dem Dapper IQueryable verwenden?

Vielen Dank

Bearbeiten:

Dank Sams Antwort wird das Problem behoben:

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

Akzeptierte Antwort

Dies ist nicht wirklich ein Dapper Problem.

Sie haben eine Sammlung von Objekten, einige von ihnen haben null Eigenschaften und Sie versuchen, sie mit einem .Contains

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


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum