我正在使用 EF Core 和 .NET 5.0。
我的存盤庫有這樣的方法:
public async Task<IEnumerable<Report>> GetByAsync(Expression<Func<Report, bool>> expression)
{
return await DbSet.Where(expression).ToListAsync();
}
我想實作 aService的方法如下:
public async Task<IEnumerable<ReportResponse>> GetByAsync(int? productId, int? brandId, int? modelId, int? lineId, DateTime from, DateTime to)
{
var reports = await _repository.GetByAsync(
r => r.ProductId == productId &&
r.BrandId == brandId &&
r.ModelId == modelId &&
r.LineId == lineId &&
r.Date >= from && r.Date <= to);
// other staff
}
更新
想要得到結果,而不是創建單獨的方法,基于輸入是否有價值。
例如:
GetByAsync(1, null, null, null, '2022-05-01', '2022-06-01')
應該忽略沒有值的型別。
和:
var reports = await _repository.GetByAsync(r => r.ProductId == 1 && r.Date >= '2022-05-01' && r.Date <= '2022-06-01');
我嘗試使用動態查詢但無法管理。
uj5u.com熱心網友回復:
您需要的是某種動態謂詞構建器,您可以使用此實用程式類:https ://gist.github.com/YoussefSell/ec50f079dd3d1a192ba1f5cd5df2d64d
將 PredicateBuilder 類匯入專案后,實際實作將如下所示:
public async Task<IEnumerable<ReportResponse>> GetByAsync(int? productId,
int? brandId,
int? modelId,
int? lineId,
DateTime? from,
DateTime? to)
{
var predicate = PredicateBuilder.True<Report>();
if (productId.HasValue)
predicate = predicate.And(p => p.ProductId == productId);
if (brandId.HasValue)
predicate = predicate.And(p => p.BrandId== brandId);
if (modelId.HasValue)
predicate = predicate.And(p => p.ModelId == modelId);
if (lineId.HasValue)
predicate = predicate.And(p => p.LineId == lineId);
if (from.HasValue)
predicate = predicate.And(p => p.Date >= from);
if (to.HasValue)
predicate = predicate.And(p => p.Date <= to);
// pass the predicate
var reports = await _repository.GetByAsync(predicate);
// other code ...
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/486371.html
上一篇:Linux版本的專案環境搭建
