JSON を jQuery datatableに返すアクションがあります。返されたデータは、渡されたパラメータに応じてフィルタリングできます。コードは次のとおりです。
public ActionResult IndexAjaxHandler(jQueryDataTableParamModel parameters) {
var data = _mailingListRep.GetAllWithinAccount();
IEnumerable<MailingList> filtered;
// Filtering - THIS DOES NOT WORK!
if (!string.IsNullOrEmpty(parameters.sSearch)) {
filtered = data.Where(c =>
c.MailingListName.Contains(parameters.sSearch) ||
((c.IsDoubleOptIn) ? "Yes" : "No").Contains(parameters.sSearch, StringComparison.OrdinalIgnoreCase) ||
c.Created.ToString("dd MMM yyyy").Contains(parameters.sSearch) ||
c.ActiveMembers.Count().ToString().Contains(parameters.sSearch) ||
c.AvailableSegments.Count().ToString().Contains(parameters.sSearch)
);
}
else {
filtered = data;
}
// create json object
// return;
}
問題は、これにより次のエラーが発生することです。
メソッド 'Boolean Contains(System.String, System.String, System.StringComparison)' には、サポートされている SQL への変換がありません。
しかし
同じコントローラには、JSON をデータテーブルに返す別のアクションもあり、まったく同じフィルタリング方法を使用し、正常に動作します!
public ActionResult ViewDeletedAjaxHandler(int id, jQueryDataTableParamModel parameters) {
var list = _mailingListRep.GetByIDWithinAccount(id);
var data = list.DeletedMembers;
IEnumerable<MailingListMember> filtered;
// Filtering - THIS WORKS, NO ERRORS!
if (!string.IsNullOrEmpty(parameters.sSearch)) {
filtered = data.Where(c =>
c.EmailAddress.Contains(parameters.sSearch, StringComparison.OrdinalIgnoreCase) ||
c.UnsubscribedDate.ToString("dd MMM yyyy").Contains(parameters.sSearch, StringComparison.OrdinalIgnoreCase)
);
}
else {
filtered = data;
}
// create json object
// return;
}
これがなぜなのか誰か知っていますか?
参考までContains(string, comparison)
に、拡張メソッドは次のとおりです。
public static bool Contains(this string source, string toCheck, StringComparison comp) {
return source.IndexOf(toCheck, comp) >= 0;
}
エラーの意味は理解できます。コードが 1 つのアクションで機能するという事実ですが、それ以外のアクションでは完全に混乱することはありません。
事前に助けてくれてありがとう。