Usando contiene () su un iqueryable costruito con Dapper (con griglia MvcContrib)
-
14-11-2019 - |
Domanda
Ho il seguente Progetto AptionResult in 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);
}
.
- .
- Le classi di Gridsortoptions e PageViewModel View sono da MVCContrib in quanto la vista utilizza La griglia da MvcContrib per visualizzare i dati.
- CONN è un SQLConnection standard che parla con un database SQL Server.
- Conn.Query è un metodo di estensione SQLConnection fornito da Dapper che sto usando per ottenere i dati.
- La proprietà della query è stata riempita nel PageDviewModel è un tipo iqueryable
Se il searchword è nullo tutto funziona bene, ma non appena si aggiunge una ricerca sulla griglia MvCContrib cade con un "riferimento all'oggetto non impostato su un'istanza di un oggetto".Funziona se rimuovo il .Contains) dal metodo AddFilter come questo:
..AddFilter("searchWord", searchWord, u => u.Login == searchWord)
Qualcuno conosce un modo per aggirare questo, o perché non posso usare contiene con il dapper iqueryable?
Grazie
Modifica:
Grazie alla risposta di Sam questo la corregge:
..AddFilter("searchWord", searchWord, u => (!string.IsNullOrEmpty(u.Login) && u.Login.Contains(searchWord))
Soluzione
Questo non è davvero un problema dapper.
Hai una raccolta di oggetti, alcuni di loro hanno proprietà null
e stai cercando di colpirli con un .Contains
var users = new UserModel[] { new UserModel(); }
// Login is null
users.AsQueryable().where(u => u.Login.Contains("bob")); // kaboom
.