簡體   English   中英

在 foreach 循環中添加 LINQ Where && 條件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM