gpt4 book ai didi

c# - Linq、Expressions、NHibernate 和 Like 比较

转载 作者:太空狗 更新时间:2023-10-29 20:53:46 25 4
gpt4 key购买 nike

我正在尝试根据确定比较类型的外部参数(通过搜索表单传递)进行类似比较(“%string”“string%”"%string%")

我的思路是:

query = query.Where(
Entity.StringProperty.Like("SearchString", SelectedComparsionType)
)

Like 方法会比基于选择的类型返回.StartsWith().EndsWith().SubString()

我对表达式的了解显然远非如此,因为我无法构建可以产生正确结果的方法(SQL 中的服务器端比较,就像使用 StartsWith 方法一样)。

最佳答案

简单的方法

就用

if (comparison == ComparisonType.StartsWith)
query = query.Where(e => e.StringProperty.StartsWith("SearchString"));
else if ...

艰难的道路

如果你想做这样的事情,要么确保你的 LINQ 提供者可以以某种方式被告知这个新方法,以及它如何转换为 SQL(不太可能),要么阻止你的方法到达 LINQ 提供者,并提供提供者它理解的东西(硬)。例如,而不是

query.Where(e => CompMethod(e.StringProperty, "SearchString", comparsionType))

你可以创建类似的东西

var query = source.WhereLike(e => e.StringProperty, "SearchString", comparsionType)

使用以下代码

public enum ComparisonType { StartsWith, EndsWith, Contains }

public static class QueryableExtensions
{
public static IQueryable<T> WhereLike<T>(
this IQueryable<T> source,
Expression<Func<T, string>> field,
string value,
SelectedComparisonType comparisonType)
{
ParameterExpression p = field.Parameters[0];
return source.Where(
Expression.Lambda<Func<T, bool>>(
Expression.Call(
field.Body,
comparisonType.ToString(),
null,
Expression.Constant(value)),
p));
}
}

您甚至可以通过这种方式添加额外的条件

var query = from e in source.WhereLike(
e => e.StringProperty, "SearchString", comparsionType)
where e.OtherProperty == 123
orderby e.StringProperty
select e;

非常非常困难的方法

(技术上)可以在提供者看到它之前重写表达式树,因此您可以首先使用您想到的查询,但您必须

  • 创建一个 Where(this IQueryable<EntityType> source, Expression<Func<EntityType, bool>> predicate)拦截 Queryable.Where ,
  • 重写表达式树,替换你的CompMethod ,无论它在哪里,与 String 之一方法,
  • 调用原件Queryable.Where用重写的表达式,
  • 并且首先,能够按照上面的扩展方法第一时间进行操作!

但这对于您的想法来说可能太复杂了。

关于c# - Linq、Expressions、NHibernate 和 Like 比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1226600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com