Использование Contains () для IQueryable, созданного с помощью Dapper (с сеткой MVCContrib)

dapper iqueryable linq mvccontrib-grid

Вопрос

У меня есть следующий 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, поскольку представление использует Grid из MVCContrib для отображения данных.
  • conn - это стандартный SQLConnection, говорящий с базой данных SQL-сервера.
  • conn.Query - это метод расширения SQLConnection, предоставляемый Dapper, который я использую для получения данных.
  • Свойство Query, заполняемое в PagedViewModel, является типом IQueryable

Если searchWord равно null, все работает нормально, но как только вы добавляете searchWord, сетка MVCContrib падает с ошибкой «Ссылка на объект, не установленная на экземпляр объекта». Он работает, если я удаляю .Contains) из метода AddFilter следующим образом:

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

Кто-нибудь знает об этом, или почему я не могу использовать Содержит с Dapper IQueryable?

благодаря

Редактировать:

Благодаря ответу Сэма это исправляет:

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

Принятый ответ

Это не проблема Dapper.

У вас есть коллекция объектов, некоторые из которых имеют свойства null и вы пытаетесь поразить их .Contains

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


Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему