Dapperで構築されたIQUeryableでcontains()を使用する(MVCContrib Gridを使用)
-
14-11-2019 - |
質問
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とPagesViewModelクラスはMVCContribからのものです。 データを表示するためのMVCContribのグリッド。
- connは、SQL Serverデータベースと通信する標準のSQLConnectionです。
- conn.queryは、データを取得するために使用しているDapperによって提供されるSQLConnection拡張方法です。
- PageViewModelに埋められているクエリプロパティは、iQueryable型です。
SearchwordがNULLの場合すべてがうまく機能しますが、Searchwordを追加するとすぐにMVCContribグリッドが 'オブジェクト参照がオブジェクトのエラーのインスタンスに設定されていません]に立ち下がります。このようなAddFilterメソッドから.Containsを削除した場合は機能します。
..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
. 所属していません StackOverflow