私はJQGridアドバンス検索機能multipleSearch: true, multipleGroup: true
を使用しています。JQGrid Advance Search - 「AND」演算子と「OR」演算子を同時に使用できますか?
私はAsp.net MVCとclassic ado.net +ストアドプロシージャも使用しています。
JGRIDのユーザー検索データがある場合は、この検索条件をパラメータ値としてストアドプロシージャに渡します。このように...
Select *
From tableName
Where @WhereClauseDynamic
私は "Where Clause Generator"クラスを作成しました。上部のコードを使用することにより
[ModelBinder(typeof(GridModelBinder))]
public class JqGrid_Setting_VewModel
{
public bool IsSearch { get; set; }
public int PageSize { get; set; }
public int PageIndex { get; set; }
public string SortColumn { get; set; }
public string SortOrder { get; set; }
public string Where { get; set; }
}
public class WhereClauseGenerator
{
private static readonly string[] FormatMapping = {
" ({0} = '{1}') ", // "eq" - equal
" ({0} <> {1}) ", // "ne" - not equal
" ({0} < {1}) ", // "lt" - less than
" ({0} <= {1}) ", // "le" - less than or equal to
" ({0} > {1}) ", // "gt" - greater than
" ({0} >= {1}) ", // "ge" - greater than or equal to
" ({0} LIKE '{1}%') ", // "bw" - begins with
" ({0} NOT LIKE '{1}%') ", // "bn" - does not begin with
" ({0} LIKE '%{1}') ", // "ew" - ends with
" ({0} NOT LIKE '%{1}') ", // "en" - does not end with
" ({0} LIKE '%{1}%') ", // "cn" - contains
" ({0} NOT LIKE '%{1}%') " // "nc" - does not contain
};
public string Generator(Filter _Filter)
{
var sb = new StringBuilder();
foreach (Rule rule in _Filter.rules)
{
if (sb.Length != 0)
sb.Append(_Filter.groupOp);
sb.AppendFormat(FormatMapping[(int)rule.op], rule.field, rule.data);
}
return sb.ToString();
}
}
public class GridModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
try
{
var request = controllerContext.HttpContext.Request;
var serializer = new JavaScriptSerializer();
var _WhereClauseGenerator = new WhereClauseGenerator();
var _IsSearch = bool.Parse(request["_search"] ?? "false");
var _PageIndex = int.Parse(request["page"] ?? "1");
var _PageSize = int.Parse(request["rows"] ?? "10");
var _SortColumn = request["sidx"] ?? "";
var _SortOrder = request["sord"] ?? "asc";
var _Where = request["filters"] ?? "";
return new JqGrid_Setting_VewModel
{
IsSearch = _IsSearch,
PageIndex = _PageIndex,
PageSize = _PageSize,
SortColumn = _SortColumn,
SortOrder = _SortOrder,
Where = (_IsSearch == false || string.IsNullOrEmpty(_Where)) ? string.Empty : _WhereClauseGenerator.Generator(serializer.Deserialize<Filter>(_Where))
};
}
catch
{
return null;
}
}
}
[DataContract]
public class Filter
{
[DataMember]
public GroupOp groupOp { get; set; }
[DataMember]
public List<Rule> rules { get; set; }
}
[DataContract]
public class Rule
{
[DataMember]
public string field { get; set; }
[DataMember]
public Operations op { get; set; }
[DataMember]
public string data { get; set; }
}
public enum GroupOp
{
AND,
OR
}
public enum Operations
{
eq, // "equal"
ne, // "not equal"
lt, // "less"
le, // "less or equal"
gt, // "greater"
ge, // "greater or equal"
bw, // "begins with"
bn, // "does not begin with"
//in, // "in"
//ni, // "not in"
ew, // "ends with"
en, // "does not end with"
cn, // "contains"
nc // "does not contain"
}
は、私はだから
{
"groupOp":"AND",
"rules":[{"field":"Seminar_Code","op":"eq","data":"MED01"},
{"field":"Seminar_Code","op":"eq","data":"CMP05"}],"groups":[]
}
sb.ToString() // Output vlaue
" (Seminar_Code = 'MED01') AND (Seminar_Code = 'CMP05') "
のように検索したときにすべてが正しいですが、それは完全に正しいです。
しかし、それはそのような、より複雑な検索クエリに来て...
{
"groupOp":"AND",
"rules":[{"field":"Seminar_Code","op":"eq","data":"MED01"},
{"field":"Seminar_Code","op":"eq","data":"CMP05"}],
"groups":[{
"groupOp":"OR",
"rules": [{"field":"Seminar_Code","op":"eq","data":"CMP01"}],"groups":[]}]
}
sb.ToString() // Actual Output value is like that below
" (Seminar_Code = 'MED01') AND (Seminar_Code = 'CMP05') "
しかし、私が予想していたことは以下のことのようです。..
" ((Seminar_Code = 'MED01') AND (Seminar_Code = 'CMP05')) OR (Seminar_Code = 'CMP01') "
それでは、どのように私はそれを正しく行うことができます?
JQGridは「AND」+「OR」のような複数のグループ操作をサポートしていますか?このサポートは同時に1人のオペレータだけですか? 「AND」と「OR」オペレータを同時に使用できますか?
すべての提案をいただければ幸いです。
この質問は既に質問されています。http://stackoverflow.com/questions/9590307/how-to-create-sql-where-clause-from-jqgrid-multiplegroup-filter-condition-in-asp – Andrus
@Frank:使用しているデータベースへのどのようなアクセスですか?例えば 'ExecuteReader'を持つ' SqlCommand'であれば、 'filters'のデータの代わりに' @p1'、 '@p2'、' @p3'などのパラメータを持つWHERE部分を生成することができます。 'filters'の解析中に配列' SqlParameter [] 'を埋めることができ、' SqlCommand.Parameters.AddRange'を使ってコマンドにパラメータを含めることができます。さらに、 'rule'と' group'の 'field'プロパティの値が選択したテーブル(またはクエリ)の列のリストにあることを確認する必要があります。 – Oleg
@Andrus:[あなたの質問]について忘れました(http://stackoverflow.com/questions/9590307/how-to-create-sql-where-clause-from-jqgrid-multiplegroup-filter-condition-in-asp) 。私は後でそれを見てみましょう。 – Oleg