C#動態查詢:巧用Expression組合多條件表示式

架构师老卢發表於2024-05-10
C#動態查詢:巧用Expression組合多條件表示式

概述:在C#中,透過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。透過建立表示式樹,可輕鬆構建複雜的查詢條件。

在C#中,可以使用AndAlsoOrElse方法組合兩個Expression<Func<T, bool>>型別的表示式。以下是詳細解釋和例項原始碼:

方法和步驟:

  1. 使用Expression類建立表示式樹。
  2. 使用AndAlsoOrElse方法組合兩個表示式。

詳細例項原始碼:

using System;
using System.Linq.Expressions;

class Program
{
    static void Main()
    {
        // 步驟1:定義Person類
        class Person
        {
            public string Name { get; set; }
            public int Age { get; set; }
        }

        // 步驟2:建立Expression引數
        ParameterExpression parameter = Expression.Parameter(typeof(Person), "p");

        // 步驟3:建立第一個表示式,檢查年齡是否大於等於 18
        Expression<Func<Person, bool>> ageExpression = Expression.Lambda<Func<Person, bool>>(
            Expression.GreaterThanOrEqual(
                Expression.Property(parameter, nameof(Person.Age)),
                Expression.Constant(18)
            ),
            parameter
        );

        // 步驟4:建立第二個表示式,檢查姓名是否為 "John"
        Expression<Func<Person, bool>> nameExpression = Expression.Lambda<Func<Person, bool>>(
            Expression.Equal(
                Expression.Property(parameter, nameof(Person.Name)),
                Expression.Constant("John")
            ),
            parameter
        );

        // 步驟5:組合表示式,要求年齡大於等於 18 且姓名為 "John"
        Expression<Func<Person, bool>> combinedExpression = Expression.Lambda<Func<Person, bool>>(
            Expression.AndAlso(ageExpression.Body, nameExpression.Body),
            parameter
        );

        // 步驟6:編譯並使用組合後的表示式
        var compiledExpression = combinedExpression.Compile();

        // 步驟7:建立Person物件並測試
        var person1 = new Person { Name = "John", Age = 20 };
        var person2 = new Person { Name = "Alice", Age = 25 };

        Console.WriteLine(compiledExpression(person1)); // 輸出 True
        Console.WriteLine(compiledExpression(person2)); // 輸出 False
    }
}

在這個例子中,AndAlso方法用於將兩個表示式組合成一個邏輯與的表示式。建立了兩個簡單的表示式來檢查年齡和姓名條件,然後透過AndAlso方法組合成一個新的表示式。最後,使用Compile方法將組合後的表示式編譯為委託,可以用於實際的資料測試。

相關文章