gpt4 book ai didi

c# - Linq to Sql 任意关键字搜索查询

转载 作者:太空狗 更新时间:2023-10-29 23:04:29 28 4
gpt4 key购买 nike

我的应用程序中有一个案例,用户可以在其中搜索术语列表。搜索需要按以下顺序进行三遍:

  • 一个与他们输入的内容完全匹配。完成,很简单。
  • 所有单词(单独)匹配的一个。完成,也很简单。
  • 其中任何的单词都匹配...如何匹配?

本质上,我如何在 Linq to Sql 中告诉它这样做:

select * from stuff s where s.Title like '%blah%' || s.Title like '%woo&' || s.Title like '%fghwgads%' || s.Title like...

等等?

最佳答案

这可能很难...我认为您必须编写自己的运算符。

(更新:是的,我测试过它,它有效。)

public static class QueryExtensions
{
public static IQueryable<TEntity> LikeAny<TEntity>(
this IQueryable<TEntity> query,
Expression<Func<TEntity, string>> selector,
IEnumerable<string> values)
{
if (selector == null)
{
throw new ArgumentNullException("selector");
}
if (values == null)
{
throw new ArgumentNullException("values");
}
if (!values.Any())
{
return query;
}
var p = selector.Parameters.Single();
var conditions = values.Select(v =>
(Expression)Expression.Call(typeof(SqlMethods), "Like", null,
selector.Body, Expression.Constant("%" + v + "%")));
var body = conditions.Aggregate((acc, c) => Expression.Or(acc, c));
return query.Where(Expression.Lambda<Func<TEntity, bool>>(body, p));
}
}

然后你可以调用它:

string[] terms = new string[] { "blah", "woo", "fghwgads" };
var results = stuff.LikeAny(s => s.Title, terms);

附言您需要将 System.Linq.ExpressionsSystem.Data.Linq.SqlClient 命名空间添加到 QueryExtensions 类的命名空间。

关于c# - Linq to Sql 任意关键字搜索查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2010639/

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