繁体   English   中英

使用 linq 查找文本字段是否包含列表中的任何字符串

[英]using linq to find if a text field contains any string in a list

我在 asp.net 核心 v3.1 中运行它

我的问题类似于这个问题:
如何使用 Linq 检查字符串列表是否包含列表中的任何字符串

与与第一个答案有关的具体问题,使得

filterTags = ["abc", "cd", "efg"]
var results = db.People
                .Where(p => filterTags.Any(tag => p.Tags.Contains(tag)));

所以基本上说
给我所有人数据库的结果
谁的标签字段包含任何 filterTags
其中标签 = 由一堆空格分隔的标签填充的大文本字段

这看起来很简单(尤其是因为之前已经写过)
但我得到一个错误

System.InvalidOperationException:无法翻译 LINQ 表达式“DbSet.Where(p => __filterTags_0.Any(tag => p.Tags.Contains(tag)))”。 以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估

有谁知道这意味着什么或我做错了什么?

这对于纯 EF LINQ 是不可能的。 您必须创建帮助程序来转换表达式树中的搜索列表。

public static class QueryExtensions
{
    private static MethodInfo _containsMethodInfo = typeof(string).GetMethod("Contains")!;

    public static IQueryable<T> FilterUsingContains<T>(this IQueryable<T> query, Expression<Func<T, string>> prop, IList<string> items)
    {
        if (items.Count == 0)
            return query.Where(e => 1 == 2);

        var param = prop.Parameters[0];

        var predicate = items.Select(i =>
                (Expression)Expression.Call(prop.Body, _containsMethodInfo, Expression.Constant(i, typeof(string))))
            .Aggregate(Expression.OrElse);

        var lambda = Expression.Lambda<Func<T, bool>>(predicate, param);

        return query.Where(lambda);
    }
}

然后你可以在你的查询中使用这个扩展

filterTags = ["abc", "cd", "efg"]
var results = db.People
    .Where(p => p.Tags.AsQueryable().FilterUsingContains(t => t, filterTags).Any());

这是一个解决方法:

using System.Linq; 

string[] filterTags = {"abc", "cd", "efg"};
var results = db.People.Where(p => filterTags.Contains(p.Tags)).ToList();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM