Когда-либо, когда у меня было много вариантов для сортировки и фильтрации, в моем репозитории я использовал "переключатель", чтобы решить, но код очень дублирован. Как я могу использовать кодовое распоряжение для удаления повторяющегося кода? У вас есть решение для оптимизации этого кода?
Пример кода:
IEnumerable<Products> products;
switch (orderBy)
{
case "Create":
products = _GFazContext.Products
//... many conditions like:
.Where(r => (productId == null || r.ProductId == productId))//Duplicate code
.Where(r => (groupId == null || r.GroupId == groupId))//Duplicate code
.Where(r => (statusId == null || r.StatusId == statusId)) //Duplicate code
//Condition about the order
.Where(r => (data1 == null || r.CreateDate >= data1))
.Where(r => (data2 == null || r.CreateDate <= data2))
.Include(r => r.Group) //Duplicate code
//Specific order
.OrderBy(p => p.CreateDate)
.Skip(pagination.SkipRecords)//Duplicate code
.Take(pagination.PageSize);//Duplicate code
break;
case "Update":
products = _GFazContext.Products
//... many conditions like:
.Where(r => (productId == null || r.ProductId == productId))//Duplicate code
.Where(r => (groupId == null || r.GroupId == groupId))//Duplicate code
.Where(r => (statusId == null || r.StatusId == statusId)) //Duplicate code
//conditions about the order
.Where(r => (data1 == null || r.LastUpdate >= data1))
.Where(r => (data2 == null || r.LastUpdate <= data2))
.Include(r => r.Group) //Duplicate code
//Specific orders
.OrderBy(p => p.LastUpdate)
.Skip(pagination.SkipRecords)//Duplicate code
.Take(pagination.PageSize);//Duplicate code
break; break;
default:
products = _GFazContext.Products
//... many conditions like:
.Where(r => (productId == null || r.ProductId == productId))//Duplicate code
.Where(r => (groupId == null || r.GroupId == groupId))//Duplicate code
.Where(r => (statusId == null || r.StatusId == statusId)) //Duplicate code
//Condition about the order
.Where(r => (data1 == null || r.ReleaseDate >= data1))
.Where(r => (data2 == null || r.ReleaseDate <= data2))
.Include(r => r.Group) //Duplicate code
//Specific orders
.OrderBy(p => p.ReleaseDate)
.Skip(pagination.SkipRecords)//Duplicate code
.Take(pagination.PageSize);//Duplicate code
break;
}
return products;