استخدام يحتوي على () على IQueryable المبني باستخدام Dapper (مع MVCContrib Grid)

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

سؤال

لقد حصلت على ActionResult التالي في مشروع ASP.NET MVC 3:

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 هو SQLConnection قياسي يتحدث إلى قاعدة بيانات خادم SQL.
  • conn.Query هي طريقة ملحق SQLConnection مقدمة من Dapper والتي أستخدمها للحصول على البيانات.
  • خاصية الاستعلام التي يتم تعبئتها في PagedViewModel هي من النوع IQueryable

إذا كانت قيمة searchWord فارغة، فكل شيء يعمل بشكل جيد، ولكن بمجرد إضافة كلمة بحث، تسقط شبكة MVCContrib مع الخطأ "لم يتم تعيين مرجع الكائن إلى مثيل كائن".إنه يعمل إذا قمت بإزالة .Contains) من طريقة AddFilter مثل هذا:

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

هل يعرف أي شخص طريقة للتغلب على هذا الأمر، أو لماذا لا يمكنني استخدام "يحتوي على" مع Dapper IQueryable؟

شكرًا

يحرر:

بفضل إجابة سام، تم حل المشكلة:

.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 مع الإسناد
لا تنتمي إلى StackOverflow
scroll top