2

複数のグループ化が使用されている場合、jqgrid高度な検索は次のような検索条件を生成できます

{"groupOp":"AND","rules":[],"groups":[{"groupOp":"AND","rules":[{"field":"Nimi","op":"cn","data":"kk"},{"field":"Nimi","op":"cn","data":"kkk"}],"groups":[]}]}

を使用してASP.NETMVC2で逆シリアル化しようとしています

            var serializer = new JavaScriptSerializer();
            var filtersList = serializer.Deserialize<Filter>(_filters);


class Filter
{
    public GroupOp groupOp { get; set; }
    public List<Rule> rules { get; set; }
    public List<Filter> groups { get; set; }
}

class Rule
{
    public string field { get; set; }
    public Operations op { get; set; }
    public string data { get; set; }
}

enum GroupOp
{
    AND,
    OR
}

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"
}

空のfiltersList.rulesプロパティを返します

このデータから正しいルールを取得するにはどうすればよいですか?

アップデート

フィルター

    {"groupOp":"AND","rules":[{"field":"Nimi","op":"cn","data":""},
{"field":"Nimi","op":"cn","data":""},{"field":"Nimi","op":"cn","data":""}],
"groups":[{"groupOp":"AND","rules":[],"groups":[]},{"groupOp":"AND","rules":
[{"field":"Nimi","op":"cn","data":""}],"groups":[{"groupOp":"AND","rules":[],
"groups":[{"groupOp":"AND","rules":[],"groups":[]},{"groupOp":"AND","rules":[],"groups":[{"groupOp":"AND","rules":[],"groups":[{"groupOp":"AND","rules":[],
"groups":[{"groupOp":"AND","rules":[],"groups":[{"groupOp":"AND","rules":[],"groups":[]},{"groupOp":"AND","rules":[],"groups":[]}]}]}]}]},{"groupOp":"AND","rules":[{"field":"Nimi","op":"cn","data":""}],"groups":[{"groupOp":"AND","rules":[{"field":"Nimi","op":"cn","data":""},{"field":"Nimi","op":"cn","data":""}],
"groups":[]}]},{"groupOp":"AND","rules":[],"groups":[]},{"groupOp":"AND","rules":[],"groups":[]},{"groupOp":"AND","rules":[],"groups":[]},{"groupOp":"AND","rules":[],"groups":[]}]}]}]}

参照された回答で更新された部分のコードを使用しても、無効な場所が生成されます

    ((klient.Nimi ILIKE ('%' || E'' || '%') ESCAPE '!')AND(klient.Nimi ILIKE
 ('%' || E'' || '%') ESCAPE '!')AND(klient.Nimi ILIKE ('%' || E'' || '%') ESCAPE '!'))AND
((((klient.Nimi ILIKE ('%' || E'' || '%') ESCAPE '!'))AND(((((())))AND(((klient.Nimi ILIKE ('%' || E'' || '%') ESCAPE '!'))AND(((klient.Nimi ILIKE ('%' || E'' || '%') ESCAPE '!')
AND(klient.Nimi ILIKE ('%' || E'' || '%') ESCAPE '!'))))))))
4

1 に答える 1

1

コードに問題はありません

const string filters = "{\"groupOp\":\"AND\",\"rules\":[]," +
    "\"groups\":[{\"groupOp\":\"AND\",\"rules\":[" +
        "{\"field\":\"Nimi\",\"op\":\"cn\",\"data\":\"kk\"}," +
        "{\"field\":\"Nimi\",\"op\":\"cn\",\"data\":\"kkk\"}],\"groups\":[]}]}";

var serializer = new JavaScriptSerializer();
var filtersList = serializer.Deserialize<Filter>(filters);

whereis空のリストを作成しfiltersListます。filtersList.rulesそれはあなたが持っている入力データに対応しています。反対側では、filtersList.groupsパーツは空ではありません。上記filtersListのコードFilterから、次の直接初期化と同等のオブジェクトが生成されます。

var filtersList = new Filter {
    groupOp = GroupOp.AND,
    rules = new List<Rule>(0),
    groups = new List<Filter> {
        new Filter {
            groupOp = GroupOp.AND,
            rules = new List<Rule> {
                new Rule {field = "Nimi", op = Operations.cn, data = "kk"},
                new Rule {field = "Nimi", op = Operations.cn, data = "kkk"}
            },
            groups = new List<Filter>(0)
        }
    }
};

情報を解析すると、最後に次のようなステートメントfiltersListを取得できます。WHERE

(Nimi LIKE '%kk%') AND (Nimi LIKE '%kkk%')

たとえば、回答のUPDATED部分のコードを参照してください。答えからのコードが正確に生成((Nimi LIKE '%kk%')AND(Nimi LIKE '%kkk%'))されることは、実質的に同じです。

于 2012-04-07T20:54:50.850 に答える