0

我在 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 网格就会出现“对象引用未设置为对象实例”错误。如果我从 AddFilter 方法中删除 .Contains) ,它会起作用,如下所示:

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

任何人都知道解决这个问题的方法,或者为什么我不能将包含与 Dapper IQueryable 一起使用?

谢谢

编辑:

感谢 Sam 的回答,这解决了它:

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

1 回答 1

1

这并不是真正的 Dapper 问题。

您有一组对象,其中一些具有null属性,并且您正试图用.Contains

var users = new UserModel[] { new UserModel(); } 
// Login is null 
users.AsQueryable().where(u => u.Login.Contains("bob")); // kaboom
于 2012-01-26T03:24:04.933 回答