网站首页 网站源码
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);
}
}
上述代码定义了一组用于构建表达式树的比较策略类,这些类实现了 IComparisonStrategy
接口。每个类负责生成特定类型的比较表达式,通常用于 LINQ 查询或动态查询构建。以下是每个类的详细解释:
EqualComparison:
IComparisonStrategy
接口,提供了一个方法 BuildExpression
,用于构建一个等于比较的表达式。memberExpression == value
的表达式树。public Expression BuildExpression(Expression memberExpression, object? value)
{
return Expression.Equal(memberExpression, Expression.Constant(value));
}
NotEqualComparison:
EqualComparison
,这个类构建一个不等于比较的表达式。memberExpression != value
的表达式树。public Expression BuildExpression(Expression memberExpression, object? value)
{
return Expression.NotEqual(memberExpression, Expression.Constant(value));
}
GreaterThanComparison:
memberExpression > value
的表达式树。public Expression BuildExpression(Expression memberExpression, object? value)
{
return Expression.GreaterThan(memberExpression, Expression.Constant(value));
}
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 查询,而不需要在编译时确定查询的结构。