使用LINQ進行可選擇化聯集條件(AND)的設計手法

之前有發過一篇類似的文章,不過針對的是SQL Parameter的情境,時至今日轉移到LINQ的環境,用同樣的邏輯在實作一次。

能否用一次性的語法,就把多重條件的查詢完成?

講白一點的就是說,在查詢來源端可能多重條件的情況下,能否有一個條件式就把這個問題解決,答案是可以的,前提就是要利用一些邏輯的小技巧。

舉例來說,來源端可能給查詢的函式單一值(查詢帳號符合),也有可能給多重值(查詢帳號與密碼符合),那我我們可以用下列的LINQ程式碼來完成這種多條件的查詢。

List<User> oData = new List<User>()
{
  new User() { cAccount = "John",  cPassword = "1234" },
  new User() { cAccount = "Marry", cPassword = "5678" },
  new User() { cAccount = "Tom",   cPassword = "9012" },
  new User() { cAccount = "Adam",  cPassword = "3456" }
};

//假設這邊是由外部輸入引數,且條件不一(有些有給,有些沒給)
string cAcc = "John";
string cPwd = "1234";

var oResult = oData
  .Where(x =>
    ( x.cAccount == cAcc )
    &&
    (
      string.IsNullOrEmpty(cPwd) ||
      x.cPassword == cPwd
    )
  );

WriteLine(oResult.Any() ? $"找到{oResult.Count()}筆資料。" : "找不到資料。");

稍微做一下程式碼的解說:

如果你輸入cAcc且cPwd為空值的話,那麼LINQ的語句執行只會幫你做到cAcc這個條件的搜尋而已,而cPwd因為「string.IsNullOrEmpty(cPwd)」這個條件成真,後面又是加上快速Or邏輯,在判定成true的情況下,「x.cPassword == cPwd」這個語句就被自然的跳開不執行了。

很有趣也很簡潔的一種寫法,希望對看到此篇文章的您有幫助。

在使用SQL Parameter的情況下,進行可選擇化聯集條件(AND)的設計手法 SQL LINQ Select Where MultiParameter OptionalParameter MultiConditions OptionalConditions AND OR AndAlso OrElse