Tôi hơi mệt khi viết các dòng mã lớp dịch vụ như sau:Phương pháp lọc Linq được đánh máy mạnh
Dưới đây chỉ là một ví dụ cho người đọc. Vì vậy, họ có thể có lỗi hoặc lỗi chính tả, xin lỗi về điều đó :)
//ViewModel
public class EntityIndexFilterPartial
{
public int? Id { get; set; }
public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }
public IEnumerable<SelectListItem> StatusList { get; set; }
public int? StatusID { get; set; }
}
//Service Layer method
//Method parameters are reperesents view model properties
public IQueryable<Entity> FilterBy(int? id, DateTime? startDate, DateTime? endDate, int? statusId)
{
var filter = _db.Entities.AsQueryable();
if (id.HasValue)
filter = filter.Where(x => x.Id == id.Value);
if (startDate.HasValue)
filter = filter.Where(x => x.StartDate >= startDate.Value);
if (endDate.HasValue)
filter = filter.Where(x => x.EndDate <= endDate.Value);
if (statusId.HasValue)
filter = filter.Where(x => x.EntityStatus.StatusID == statusId);
return filter;
}
Tôi tìm kiếm khá đủ cho một số mã được thiết kế thông minh. Tôi biết về Thư viện LINQ động và tôi cũng sử dụng nó. Nhưng tôi đang tìm kiếm lọc mạnh mẽ. Tôi không muốn viết dây ma thuật hoặc một số loại.
Vì vậy, về cơ bản tôi đã tìm thấy một số giải pháp nhưng tôi muốn nghe từ cộng đồng này về một số mã thông minh được viết tốt. Tất nhiên có thể có hàng chục giải pháp nhưng một lần nữa làm thế nào bạn sẽ viết mã lớp dịch vụ lọc mạnh mẽ của bạn gõ. Bất kỳ ý tưởng ...
Dưới đây là vài trong số các giải pháp của tôi:
Giải pháp 1: phương pháp FilterBy Cùng nhưng các thông số khác nhau, bây giờ lấy danh sách biểu. Vì vậy, điều này có nghĩa là tôi đang tạo predicateList trong bộ điều khiển và gửi nó đến đây.
public IQueryable<Entity> FilterBy(List<Expression<Func<Entity,bool>>> predicateList)
{
var filter = _db.Entities.AsQueryable();
foreach (var item in predicateList)
{
filter = filter.FilterBy(item);
}
return filter;
}
Giải pháp 2: FilterBy phương pháp lấy EntityIndexFilterPartial như tham số trong dịch vụ ứng dụng lớp (không dịch vụ tên miền). Tôi chắc rằng thiết kế này có một số vấn đề, nhưng tôi muốn nghe ý kiến của bạn.
public IQueryable<Entity> FilterBy(EntityIndexFilterPartial filterPartial)
{
//I'm calling the domain service layer FilterBy method such as like in solution 1.
}
Giải pháp 3: Tôi nghĩ cái này tốt hơn nhiều so với những người khác nhưng tôi vẫn đang nghĩ đến một cái gì đó đơn giản hơn và mã tốt hơn.
//helper class
public static class FilterByHelper
{
public static IQueryable<T> If<T>(this IQueryable<T> filter, bool condition, Expression<Func<T, bool>> predicate)
{
if (condition)
return filter.FilterBy(predicate);
return filter;
}
public static IQueryable<T> FilterBy<T>(this IQueryable<T> filter, Expression<Func<T, bool>> predicate)
{
return filter.Where(predicate);
}
}
public IQueryable<Entity> FilterBy(int? id, DateTime? startDate, DateTime? endDate, int? statusId)
{
return _db.Entities
.If(id.HasValue, x => x.Id == id.Value)
.If(startDate.HasValue, x => x.StartDate >= startDate.Value)
.If(endDate.HasValue, x => x.EndDate <= endDate.Value)
.If(statusId.HasValue, x => x.EntityStatus.StatusID == statusId);
}
Tôi biết điều này đã trở thành một câu hỏi dài nhưng tôi hy vọng tôi yêu cầu rõ ràng những gì tôi muốn hỏi.
Là câu hỏi nhanh và đơn giản, bạn có biết bất kỳ mã được thiết kế thông minh nào để tiết kiệm cho chúng tôi không cùng viết các dòng mã lọc này không?
Btw, tôi không tìm kiếm giải pháp mẫu hay câu trả lời lớn, bạn có thể cho tôi một số ví dụ hoặc nói cách tìm đường dẫn tốt hơn là đủ.
Tất nhiên Nếu bạn viết một câu trả lời được giải thích đầy đủ, tôi sẽ được đánh giá cao.
Cảm ơn bạn.
1 nhưng tôi sợ rằng OP sẽ không như thế này codez một trong hai;) – Icarus
1 Thật tuyệt lừa. Bạn có thể đề xuất một giải pháp tốt hơn cho các tham số phương thức lớp dịch vụ hay không. Một phần của câu hỏi của tôi về việc loại bỏ các tham số đó. Cảm ơn bạn :) –
@YusufUzun: Xin lỗi, tôi thực sự không hiểu ý bạn là gì, tôi sợ. Làm thế nào bạn sẽ vượt qua các bộ lọc mà không có bất kỳ tham số? –