[英]Adding LINQ Where && condition in a foreach loop
為了簡化我的問題,假設我有以下數據庫 model:
// database model, the list of not supported postcodes
var postcodeExclusionArray = new List<PostcodeExclusion>() {
new PostcodeExclusion(){
CustomerId = 2,
Postocde = "A11"
},
new PostcodeExclusion(){
CustomerId = 2,
Postocde = "A12"
},
new PostcodeExclusion(){
CustomerId = 2,
Postocde = "A12 4FR"
},
new PostcodeExclusion(){
CustomerId = 2,
Postocde = "AR"
},
new PostcodeExclusion(){
CustomerId = 2,
Postocde = "B11"
},
new PostcodeExclusion(){
CustomerId = 2,
Postocde = "B12"
},
new PostcodeExclusion(){
CustomerId = 2,
Postocde = "C11"
},
new PostcodeExclusion(){
CustomerId = 2,
Postocde = "C12"
},
// many more records...
};
它描述了不受支持的英國郵政編碼。 它只是一個數據源的概念,因為我們通常使用 EF Core 3.1。 請記住,每條記錄的格式在收集整個區域時可能會有所不同,例如EH
或僅特定屬性,例如AB25HZ
。
現在我想檢查我的系統是否支持提供的英國郵政編碼。 我的想法是僅使用Where
語句在查詢中執行此操作,但我不確定這是否可能。
該算法的想法是以某種方式獲取提供的郵政編碼的組合,例如
providedpostCode = "A41666";
組合:
A
A4
A41
A416
A4166
A41666
然后構建數據庫查詢,例如
bool isSupported = postcodeExclusionArray.Where(x => x.CustomerId == 2)
.Where(x=> x.Postocde == "A" ||
x.Postocde == "A" ||
x.Postocde == "A4" ||
x.Postocde == "A41" ||
x.Postocde == "A416" ||
x.Postocde == "A41666").First() == null;
有沒有辦法使用 LINQ (不是原始 SQL)來實現這一點,如果不是,什么是最佳解決方案?
我嘗試使用foreach
循環,但沒有找到任何解決方案。 如果不可能,那么最簡單的解決方案可能是生成原始 SQL 查詢,但是,這種方法的缺點是無法進行單元測試,只能通過集成測試進行測試。 另一種選擇是僅通過 customerId 從數據庫中查詢所有郵政編碼並進行簡單的迭代。 有任何想法嗎? 干杯
collections 支持Enumerable.Contains
:
string providedpostCode = "A41666";
string[] providedPostCodes = Enumerable.Range(0, providedpostCode.Length)
.Select(ix => providedpostCode.Substring(0, ix + 1))
.ToArray();
bool isSupported = !postcodeExclusionArray
.Any(x => x.CustomerId == 2 && providedPostCodes.Contains(x.Postocde));
不確定邏輯,如果您需要Any
或!Any
。
看起來你只需要用第一個字母做StartsWith
:
var postCode = providedpostCode[0];
var isSupported = postcodeExclusionArray
.Where(x => x.CustomerId == 2)
.Where(x => x.Postocde.StartsWith(postCode));
無論如何,我認為這只是對問題的不好解釋。
不想重復自己很多,只是重用擴展可能會回答: https://stackoverflow.com/a/67666993/10646316
並編寫以下代碼(重復使用以前的答案代碼):
var providedpostCode = "A41666";
var providedPostCodes = Enumerable.Range(0, providedpostCode.Length - 1)
.Select(ix => providedpostCode.Substring(0, ix + 1))
.ToArray();
var isSupported = postcodeExclusionArray
.Where(x => x.CustomerId == 2)
.FilterByItems(providedPostCodes, (x, c) => x.Postocde == c, true);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.