网站首页 网站源码
website
站点相关全部源代码,隐藏了一些关于服务器的信息
using System;
using System.Collections;
using System.Linq;
using System.Linq.Expressions;

namespace Dpz.Core.Infrastructure.ExpressTreeQuery.ComparisonStrategy;

public class EqualComparison : IComparisonStrategy
{
    public Expression BuildExpression(Expression memberExpression, object? value)
    {
        return Expression.Equal(memberExpression, Expression.Constant(value));
    }
}

public class NotEqualComparison : IComparisonStrategy
{
    public Expression BuildExpression(Expression memberExpression, object? value)
    {
        return Expression.NotEqual(memberExpression, Expression.Constant(value));
    }
}

public class GreaterThanComparison : IComparisonStrategy
{
    public Expression BuildExpression(Expression memberExpression, object? value)
    {
        return Expression.GreaterThan(memberExpression, Expression.Constant(value));
    }
}

public class ContainsComparison : IComparisonStrategy
{
    public Expression BuildExpression(Expression memberExpression, object? value)
    {
        if (value is string stringValue)
        {
            var containsMethod = typeof(string).GetMethod("Contains", [typeof(string)]);
            if (containsMethod != null)
            {
                return Expression.Call(
                    memberExpression,
                    containsMethod,
                    Expression.Constant(stringValue)
                );
            }
        }

        if (value is IEnumerable enumerable)
        {
            var containsMethod = typeof(Enumerable)
                .GetMethods()
                .FirstOrDefault(m => m.Name == "Contains" && m.GetParameters().Length == 2)
                ?.MakeGenericMethod(memberExpression.Type);
            if (containsMethod != null)
            {
                return Expression.Call(
                    containsMethod,
                    Expression.Constant(enumerable),
                    memberExpression
                );
            }
        }

        return Expression.Constant(false);
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

上述代码定义了一组用于构建表达式树的比较策略类,这些类实现了 IComparisonStrategy 接口。每个类负责生成特定类型的比较表达式,通常用于 LINQ 查询或动态查询构建。以下是每个类的详细解释:

  1. EqualComparison:

    • 这个类实现了 IComparisonStrategy 接口,提供了一个方法 BuildExpression,用于构建一个等于比较的表达式。
    • 它接受一个成员表达式(通常是一个属性)和一个值,然后返回一个表示 memberExpression == value 的表达式树。
    public Expression BuildExpression(Expression memberExpression, object? value)
    {
        return Expression.Equal(memberExpression, Expression.Constant(value));
    }
    
  2. NotEqualComparison:

    • 类似于 EqualComparison,这个类构建一个不等于比较的表达式。
    • 它返回一个表示 memberExpression != value 的表达式树。
    public Expression BuildExpression(Expression memberExpression, object? value)
    {
        return Expression.NotEqual(memberExpression, Expression.Constant(value));
    }
    
  3. GreaterThanComparison:

    • 这个类用于构建一个大于比较的表达式。
    • 它返回一个表示 memberExpression > value 的表达式树。
    public Expression BuildExpression(Expression memberExpression, object? value)
    {
        return Expression.GreaterThan(memberExpression, Expression.Constant(value));
    }
    
  4. ContainsComparison:

    • 这个类用于构建一个包含比较的表达式,支持字符串和集合类型。
    • 如果 value 是字符串,它会生成一个调用 string.Contains 方法的表达式,表示 memberExpression.Contains(stringValue)
    • 如果 value 是一个 IEnumerable,它会生成一个调用 Enumerable.Contains 方法的表达式,表示 memberExpression 是否在 enumerable 中。
    • 如果 value 既不是字符串也不是集合,则返回一个常量 false 的表达式。
    public Expression BuildExpression(Expression memberExpression, object? value)
    {
        if (value is string stringValue)
        {
            var containsMethod = typeof(string).GetMethod("Contains", new[] { typeof(string) });
            if (containsMethod != null)
            {
                return Expression.Call(
                    memberExpression,
                    containsMethod,
                    Expression.Constant(stringValue)
                );
            }
        }
    
        if (value is IEnumerable enumerable)
        {
            var containsMethod = typeof(Enumerable)
                .GetMethods()
                .FirstOrDefault(m => m.Name == "Contains" && m.GetParameters().Length == 2)
                ?.MakeGenericMethod(memberExpression.Type);
            if (containsMethod != null)
            {
                return Expression.Call(
                    containsMethod,
                    Expression.Constant(enumerable),
                    memberExpression
                );
            }
        }
    
        return Expression.Constant(false);
    }
    

总结

这些类的主要功能是动态构建 LINQ 表达式树,以便在运行时根据不同的条件生成查询。这种方式在构建动态查询时非常有用,尤其是在需要根据用户输入或其他条件生成查询时。通过使用表达式树,可以在运行时构建和执行 LINQ 查询,而不需要在编译时确定查询的结构。

loading