【问题标题】:How to build an Expression for FullText Search with EF Core?如何使用 EF Core 构建全文搜索表达式?
【发布时间】:2022-01-18 11:02:54
【问题描述】:

给定一个PropertyName 和一个Value 来搜索如何构建一个可以使用的表达式?

结果必须是EF.Functions.Contains(PropertyName, Value)

最后我将表达式应用于IQueryable

谢谢!

【问题讨论】:

  • 问题看起来像开发人员任务。到目前为止你尝试过什么?
  • 我已经构建了这个github.com/timewarp-it/xtentityframework/blob/main/…,如果属性有一些属性,我希望它在第 115 行支持全文搜索。不幸的是,我无法通过反射找到 EF.Functions.Contains。

标签: c# entity-framework-core


【解决方案1】:

Contains全文搜索方法位于SqlServerDbFunctionsExtensions

var PropertyName = "SomeProp";
var Value = "SomeValue";

var parameter = Expression.Parameter(typeof(SomeType), "c");
var propertyPath = PropertyName.Split('.')
    .Aggregate((Expression)parameter, Expression.Property);

var callExpression =  Expression.Call(
    typeof(SqlServerDbFunctionsExtensions),
    nameof(SqlServerDbFunctionsExtensions.Contains),
    Type.EmptyTypes,
    Expression.Constant(EF.Functions),
    propertyPath,
    Expression.Constant($"\"*{Value}*\"")
);

【讨论】:

  • 快到了!看起来将 PropertyName 作为字符串传递是行不通的。我有 x.PropertyName 作为 MemberExpression,但使用它直接抛出“无法翻译 LINQ 表达式'x'。要么以表单 (...) 重写查询”。虽然代码中的结果 ("DbSet() .Where(c => c.Firstname.Contains(\"d\") || DbFunctions .Contains( propertyReference: \"Lastname\", searchCondition: \"d \")) .OrderBy(p => p.Lastname)") 看起来不错!你知道EF.Functions.Contains 期望propertyReference 是什么吗?
  • 它只需要 PropertyName 的常量。所以你必须从x.PropertyName 中检索列名,可能来自 IModel。
  • 我不明白。虽然people = people.Where(p => EF.Functions.Contains(p.Lastname, "Duck")); 有效,但people = people.Where(p => EF.Functions.Contains("Lastname", "Duck")); does not work and throws "传递给'FreeText' 方法的'propertyReference' 参数的表达式不是对属性的有效引用。表达式必须表示对对象上全文索引属性的引用在 from 子句中引用:'from e in context.Entities where EF.Functions.FreeText(e.SomeProperty, textToSearchFor) select e'"`.
  • 我的错,你是对的它可能期望财产,从未使用过这个功能。你试过Readable Expressions吗?无论如何,您的参数有问题。从您的代码中,我无法理解它是如何提取的。
猜你喜欢
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 2019-03-11
相关资源
最近更新 更多