Использование Contains() в IQueryable, построенном с помощью Dapper (с сеткой MvcContrib)
-
14-11-2019 - |
Вопрос
У меня есть следующий ActionResult в проекте 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);
}
- Классы GridSortOptions и PagedViewModel взяты из MvcContrib, поскольку представление использует сетку из MvcContrib для отображения данных.
- conn - это стандартное SqlConnection, подключающееся к базе данных SQL server.
- conn.Query - это метод расширения SqlConnection, предоставляемый Dapper, который я использую для получения данных.
- Свойство Query, заполняемое в PagedViewModel, является типом IQueryable
Если поисковое слово равно null, все работает нормально, но как только вы добавляете поисковое слово, сетка MvcContrib закрывается с ошибкой "Ссылка на объект не установлена для экземпляра объекта".Это сработает, если я удалю .Содержит) из метода addFilter следующим образом:
.AddFilter("searchWord", searchWord, u => u.Login == searchWord)
Кто-нибудь знает способ обойти это, или почему я не могу использовать Contains с Dapper IQueryable?
Спасибо
Редактировать:
Благодаря ответу Сэма это исправляет проблему:
.AddFilter("searchWord", searchWord, u => (!string.IsNullOrEmpty(u.Login) && u.Login.Contains(searchWord))
Решение
На самом деле это не самая щеголеватая проблема.
У вас есть коллекция объектов, некоторые из них имеют null
свойства, и вы пытаетесь связаться с ними с помощью .Contains
var users = new UserModel[] { new UserModel(); }
// Login is null
users.AsQueryable().where(u => u.Login.Contains("bob")); // kaboom
Не связан с StackOverflow