我正在使用 EF Core 5.0 版的 asp.net core web API。
我寫了一個帶有 if 條件的查詢。
if (incomingFacilities.Count() > 0)
然后我需要過濾incomingFacilities串列中的設施。
如果(incomingFacilities.Count() < 0)我不需要過濾。我只需要得到 6 個不同的設施串列。
但是寫下面的代碼。問題是我需要一次又一次地重復相同的代碼。
所以我的東西里面的if條件更好
.Where(x => (incomingFacilities.Count() > 0 ) ?
(incomingFacilities.Contains(x.FacilityCode)) :
(x.FacilityCode > 0 )),
在這里,我正確地完成了第一部分,(即:如果incomingFacilities.Count() > 0然后進行過濾。
但第二部分則if incomingFacilities.Count() < 0不需要過濾,只需發送設施串列(只有 6 個不同的設施)
// this code is correct, but same code repeated
if (incomingFacilities.Count() > 0)
{
var hotels = await _context.Hotels
.Where(i => (i.DestinationCode == request.Destination))
.Select(i => new HotelListHotelVm
{
// removed some
HotelFacilities = i.Facilities.Select(x => new HotelListHotelVm.HotelListFacilityVm {
Id = x.Id,
FacilityGroupCode = x.FacilityGroupCode,
HotelFacilityGroupDescription = x.FacilityGroup.Description,
FacilityCode = x.FacilityCode
})
.Where(x => (incomingFacilities.Count() > 0 ) ? (incomingFacilities.Contains(x.FacilityCode)) : (x.FacilityCode > 0 )),
})
// rest
;
}
else
{
var hotels = await _context
.Hotels
.Where(i => (i.DestinationCode == request.Destination))
.Select(i => new HotelListHotelVm
{
// removed some
HotelFacilities = i.Facilities.ToList().Distinct().Take(6)
.Select(x => new HotelListHotelVm.HotelListFacilityVm {
Id = x.Id,
FacilityGroupCode = x.FacilityGroupCode,
HotelFacilityGroupDescription = x.FacilityGroup.Description,
FacilityCode = x.FacilityCode
})
})
// rest
;
}
.Where(x =>(incomingFacilities.Count() > 0 ) ? (incomingFacilities.Contains(x.FacilityCode)) : (x.FacilityCode > 0 )),
這里,
我當時做了If incomingFacilities.Count() > 0 ,使用 where 子句。
但我不知道怎么說,如果沒有, incomingFacilities.Count() > 0那么做一個具有不同價值的設施串列,只取6個。像這樣HotelFacilities = i.Facilities.ToList().Distinct().Take(6)
.Select(x => new HotelListHotelVm.HotelListFacilityVm {
Id = x.Id,
FacilityGroupCode = x.FacilityGroupCode,
HotelFacilityGroupDescription = x.FacilityGroup.Description,
FacilityCode = x.FacilityCode
})
uj5u.com熱心網友回復:
EF Core 查詢轉換器足夠智能,可以評估使用純客戶端引數的運算式并洗掉true預先已知的過濾器運算式,例如true || some_expr.
因此,您只需按如下方式撰寫過濾器:
.Where(x => !incomingFacilities.Any() || incomingFacilities.Contains(x.FacilityCode))
這將產生兩種不同的 SQL 查詢——一種帶有過濾器,一種不依賴于引數是否incomingFacilities包含元素。
uj5u.com熱心網友回復:
早上好,
如果我理解正確的話,你想要得到一個List<HotelListHotelVm>,但如果incomingFacilities.
首先,我會去掉.Count()這里的擴展名并使用它.Any()。這是出于性能原因,.Count()只有在您遍歷整個串列后才會停止。.Any()而是在它在您的串列中找到一個元素后停止,如果您的串列中有任何內容,則incomingFacilities回傳相應的元素bool。如果您不需要incomingFacilities串列中的專案數并且只檢查其中是否有任何內容.Any()是更好的選擇(例如在您的代碼中)。如果您確實需要計數值,請使用.Count().
根據您的意見,請嘗試以下操作(再次未經測驗)。首先初始化一個變數,該變數將您的酒店保存為串列(或陣列,或其他)。然后你檢查你是否有任何incomingFacilities. 如果是,則從資料庫中獲取值并將其與設施代碼進行比較。之后,您過濾串列中確實有的所有元素HotelFacilities。如果其中有一些值,hotels則不為空。
在下一步中,您查看hotels串列。如果其中有值,則不必從資料庫中檢索任何內容,如果沒有,則從資料庫中獲取前 6 個元素。
如果incomingFacilities從一開始就為空,則為空hotels,因此代碼將從資料庫中檢索 6 個元素。
我希望我現在理解正確了。
List<HotelListHotelView> hotels = new List<HotelListHotelView>();
if (incomingFacilities.Any())
{
hotels = await _context.Hotels
.Where(i => (i.DestinationCode == request.Destination))
.Select(i => new HotelListHotelVm
{
HotelFacilities = i.Facilities.Where(x => incomingFacilities.Contains(x.FacilityCode))
.Select(x => new HotelListHotelVm.HotelListFacilityVm
{
Id = x.Id,
FacilityGroupCode = x.FacilityGroupCode,
HotelFacilityGroupDescription = x.FacilityGroup.Description,
FacilityCode = x.FacilityCode
})
}).Where(h => h.HotelFacilities.Any())
.ToList();
}
if(!hotels.Any())
{
hotels = await _context.Hotels
.Where(i => (i.DestinationCode == request.Destination))
.Select(i => new HotelListHotelVm
{
HotelFacilities = i.Facilities.Distinct()
.Take(6)
.Select(x => new HotelListHotelVm.HotelListFacilityVm
{
Id = x.Id,
FacilityGroupCode = x.FacilityGroupCode,
HotelFacilityGroupDescription = x.FacilityGroup.Description,
FacilityCode = x.FacilityCode
})
}).ToList();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/382384.html
下一篇:拆分字串并洗掉最后一個值
