Dapperで構築されたIQUeryableでcontains()を使用する(MVCContrib Gridを使用)

StackOverflow https://stackoverflow.com/questions/9006748

質問

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
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top