Bugs Class GridHelper (Business Library) for Two Levels Filtering

Ada kasus saat memfilter kendo data source secara dua level, bisa lihat contoh dibawah ini:

[code language=”javascript”]
var filters = {
logic: "and",
filters: [
{//filter level 1
field: "LocationId",
operator: "eq",
value: locationOptions.value()
},
{//filter level 2
logic: "or",
filters: [
{
field: "Name",
operator: "contains",
value: $("#filter").val()
},
{
field: "Number",
operator: "contains",
value: $("#filter").val()
}
]
},
{//filter level 1
field: "IsDelete",
operator: "eq",
value: "false"
}
]
};
[/code]

Nilai whereClause yang dihasilkan oleh method CreateWhereClause tidak sesuai dengan harapan, kasus ini tidak terjadi jika filter level ke 2 berada di awal atau akhir dari index array atau dengan kata lain jika posisi filter level ke 2 berada setelah awal atau sebelum akhir dari index array maka terjadi bugs.

Nilai whereClause sebelum kode diperbaiki :

[code language=”text”]
(LocationId == @0 && (Name.ToLower().Contains(@1) || Number.ToLower().Contains(@2))LocationId == @0 && IsDelete == @3)
[/code]

Terjadi bugs setelah kode mengeksekusi filter level ke 2 lihat Number.ToLower().Contains(@2))LocationId == @0. Tidak ada logic filter setelah karakter “)” dan terjadi duplikasi dari nilai filter pertama “LocationId == @0”.

Nilai whereClause setelah kode diperbaiki :

[code language=”text”]
LocationId == @0 && (Name.ToLower().Contains(@1) || Number.ToLower().Contains(@2)) && IsDelete == @3
[/code]

Method CreateWhereClause setelah diperbaiki :

[code language=”csharp”]
public static void CreateWhereClause<T>(FilterInfo filter, ref List<object> parameters, ref string whereClause, bool level2 = false)
{
var filters = filter.Filters;

if (filters != null)
{
if (filter.Logic == null || filter.Logic == "")
{
filter.Logic = "and";
}

if (!level2)
_level1Logic = filter.Logic;

if (level2)
{
whereClause += whereClause.EndsWith(")") == true ?
string.Format("{0}{1}", ToLinqOperator(_level1Logic), "(") : "(";
}

for (int i = 0; i < filters.Count; i++)
{
var f = filters[i];

if (f.Filters == null)
{
if (!level2 && whereClause.EndsWith(")"))
whereClause += ToLinqOperator(filter.Logic);

whereClause += string.Format("{0}{1}", BuildWhereClause<T>(f, i, parameters), ToLinqOperator(filter.Logic));

if (i == (filters.Count – 1))
{
CleanUp(ref whereClause);

if (level2)
whereClause += ")";
}
}
else
{
if (level2)
throw new ArgumentException("FilterInfo can not more than two levels.");
CreateWhereClause<T>(f, ref parameters, ref whereClause, true);
}
}
}
}
[/code]

Setelah diupdate class GridHelper juga support untuk memfilter field yang bernilai “null” dan “not null”. Untuk selengkapnya bisa dilihat pada lampiran berikut ini.

Contoh penggunaan filter null dan not null :

[code language=”csharp”]
//null
var filters = new Business.Infrastructure.FilterInfo
{
Logic = "and",
Filters = new List<Business.Infrastructure.FilterInfo>
{
new Business.Infrastructure.FilterInfo
{
Field = "ParentId",
Operator = "isnull"
}
}
};

//not null
var filters = new Business.Infrastructure.FilterInfo
{
Logic = "and",
Filters = new List<Business.Infrastructure.FilterInfo>
{
new Business.Infrastructure.FilterInfo
{
Field = "ParentId",
Operator = "isnotnull"
}
}
};
[/code]

 

Catatan:

Pastikan untuk menggunakan class DynamicQueryable yang terdapat pada lampiran.

 

Happy codding & Don’t Repeat Yourself

Topaz Moderato has written 14 articles

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>