Dapper(MVCContrib Gridを使用)で構築されたIQueryableでContains()を使用すると、

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のクラスです。
  • 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でContainsを使用できないのですか?

ありがとう

編集:

サムの答えに感謝します。

.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