我正在开发一个 CRM 类型的应用程序,我正在实现的功能之一是能够查看数据网格,然后使用单个文本框来过滤来自任何列的值。我想出了一个非常丑陋的解决方案(请注意,此方法还使用 Dynamic Linq 对数据进行排序),但是我希望它更“通用”,可能使用反射,所以我可以调用 WithFiltering 扩展方法和提供过滤条件的扩展方法。这是我到目前为止所拥有的:
public List<PersonModel> GetPeople(int owningOrganisationID, int skip, int records, out int totalCount, Ordering orderByDirection, string filter, string orderBy = "")
{
if (string.IsNullOrEmpty(orderBy))
orderBy = "PersonID";
if (!string.IsNullOrEmpty(filter))
{
filter = filter.ToLower();
totalCount = Context.PeopleView.Where(p => p.OwningOrganisationID == owningOrganisationID &&
p.City.ToLower().Contains(filter)
|| p.CountryName.ToLower().Contains(filter)
|| p.Forename.ToLower().Contains(filter)
|| p.PersonTypeName.ToLower().Contains(filter)
|| p.Postcode.ToLower().Contains(filter)
|| p.Surname.ToLower().Contains(filter)).Count();
return Context.PeopleView.Where(p => p.OwningOrganisationID == owningOrganisationID &&
p.City.ToLower().Contains(filter)
|| p.CountryName.ToLower().Contains(filter)
|| p.Forename.ToLower().Contains(filter)
|| p.PersonTypeName.ToLower().Contains(filter)
|| p.Postcode.ToLower().Contains(filter)
|| p.Surname.ToLower().Contains(filter))
.OrderBy(orderBy + " " + orderByDirection.ToString())
.Skip(skip)
.Take(records)
.ToList();
}
else
{
totalCount = Context.PeopleView.Where(p => p.OwningOrganisationID == owningOrganisationID).Count();
return Context.PeopleView
.Where(o => o.OwningOrganisationID == owningOrganisationID)
.OrderBy(orderBy + " " + orderByDirection.ToString())
.Skip(skip)
.Take(records)
.ToList();
}
}
这不仅看起来很糟糕,而且容易出错,我将在几个不同的实体(PersonModel、OrganizationModel、DocumentModel 等)上使用相同类型的代码
只是想知道是否有人对更清洁的代码有更好的想法?