在使用Dapper構建的IQueryable上使用Contains()(使用MVCContrib Grid)

dapper iqueryable linq mvccontrib-grid

我在ASP.NET MVC 3項目中有以下ActionResult:

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中的Grid來顯示數據。
  • conn是與SQL服務器數據庫通信的標準SQLConnection。
  • conn.Query是Dapper提供的SQLConnection擴展方法,我用它來獲取數據。
  • 在PagedViewModel中填充的Query屬性是IQueryable類型

如果searchWord為null,則一切正常,但只要添加searchWord,MVCContrib Grid就會出現'對象引用未設置為對象的實例'錯誤。它可以工作,如果我從AddFilter方法中刪除.Contains),如下所示:

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

任何人都知道解決這個問題,或者為什麼我不能使用Dinsper IQueryable包含?

謝謝

編輯:

感謝Sam的回答,這解決了它:

.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


許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因