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