Tôi có Lưới UI Kendo mà tôi hiện đang cho phép lọc trên nhiều cột. Tôi tự hỏi nếu có một cách tiếp cận khác để loại bỏ câu lệnh chuyển đổi bên ngoài?
Về cơ bản tôi muốn có thể tạo một phương thức mở rộng để tôi có thể lọc trên a IQueryable<T>
và tôi muốn bỏ câu lệnh trường hợp bên ngoài để tôi không phải chuyển tên cột.
private static IQueryable<Contact> FilterContactList(FilterDescriptor filter, IQueryable<Contact> contactList)
{
switch (filter.Member)
{
case "Name":
switch (filter.Operator)
{
case FilterOperator.StartsWith:
contactList = contactList.Where(w => w.Firstname.StartsWith(filter.Value.ToString()) || w.Lastname.StartsWith(filter.Value.ToString()) || (w.Firstname + " " + w.Lastname).StartsWith(filter.Value.ToString()));
break;
case FilterOperator.Contains:
contactList = contactList.Where(w => w.Firstname.Contains(filter.Value.ToString()) || w.Lastname.Contains(filter.Value.ToString()) || (w.Firstname + " " + w.Lastname).Contains( filter.Value.ToString()));
break;
case FilterOperator.IsEqualTo:
contactList = contactList.Where(w => w.Firstname == filter.Value.ToString() || w.Lastname == filter.Value.ToString() || (w.Firstname + " " + w.Lastname) == filter.Value.ToString());
break;
}
break;
case "Company":
switch (filter.Operator)
{
case FilterOperator.StartsWith:
contactList = contactList.Where(w => w.Company.StartsWith(filter.Value.ToString()));
break;
case FilterOperator.Contains:
contactList = contactList.Where(w => w.Company.Contains(filter.Value.ToString()));
break;
case FilterOperator.IsEqualTo:
contactList = contactList.Where(w => w.Company == filter.Value.ToString());
break;
}
break;
}
return contactList;
}
Một số thông tin bổ sung, tôi đang sử dụng NHibernate Linq. Ngoài ra, một vấn đề khác là cột "Tên" trên lưới của tôi thực sự là "Tên" + "" + "Họ" trên thực thể liên hệ của tôi. Chúng ta cũng có thể giả sử rằng tất cả các cột có thể lọc sẽ là các chuỗi.
EDIT Hãy nhớ điều này cần phải làm việc với NHibernate Linq và AST.