You need to enable JavaScript to run this app. C# EF Core LINQ拆分SearchWord无法翻译及课程分类搜索实现问题
优惠活动
大模型
产品
解决方案
定价
更多

C# EF Core LINQ拆分SearchWord无法翻译及课程分类搜索实现问题

课程搜索功能实现需求
  • 按照内容匹配规则拆分对应字段内容
  • 现有核心问题:课程搜索逻辑未正确关联与CourseData绑定的courseCategory表,无法基于分类字段匹配搜索关键词
  • 实现目标:筛选出匹配对应分类值的课程;当搜索词无法匹配课程标题、描述、课程模块内容等其他字段时,通过课程所属分类的内容完成匹配
  • 业务规则:目前课程仅关联单个分类,当搜索词未命中课程其他字段时,需通过分类维度的搜索词完成匹配,只要存在任意符合的规则即可命中对应课程
  • 匹配要求:只要SearchWord字段存在任意匹配的子词,就应命中对应课程;SearchWord存储格式为逗号分隔的关键词,例如online undervisning,undervisning,computer undervisning,需支持匹配undervisning这类核心搜索词,支持多规则命中

参考截图

分类表结构
数据库关联概览

初始实现代码

public List<CourseData> GetCourseList(string text)//Undervisning
{
    List<CourseData> list = new List<CourseData>();
    var dataContent = _dbContext.CourseDataModul
        .Where(r => r.Title.Contains(text) 
                    || r.Deck.Contains(text) 
                    || r.CourseDataContent.FirstOrDefault(x => x.Title.Contains(text)).Title.Contains(text) 
                    || r.CourseDataContent.FirstOrDefault(x => x.Deck.Contains(text)).Deck.Contains(text)
                    || r.CourseDataContent.FirstOrDefault(x => x.ContentValue.Contains(text)).ContentValue.Contains(text))
        .ToList();
    
    foreach (var item in dataContent)
    {
        list = _dbContext.CourseData
            .Where(r => r.Id == item.CourseDataId && r.OpenNow || r.Title.Contains(text) || r.Deck.Contains(text) ||
                        r.CourseCategori.SearchWord
                            .Split(new [] {",", ", ", " "}, StringSplitOptions.None) //online undervisning,undervisning,computer undervisning
                            .Contains(text)).ToList();//undervisning
    }
    return list;
}

已参考技术方案

  • 多分隔符字符串拆分的实现逻辑
  • 逗号分隔字符串的匹配校验最佳实践

代码调整后报错说明

调整后代码

public List<CourseData> GetCourseList(string text)//Undervisning
{
    List<CourseData> list = new List<CourseData>();
    var dataContent = _dbContext.CourseDataModul
        .Where(r => r.Title.Contains(text) 
                    || r.Deck.Contains(text) 
                    || r.CourseDataContent.Any(x => x.Title.Contains(text)) 
                    || r.CourseDataContent.Any(x => x.Deck.Contains(text))
                    || r.CourseDataContent.Any(x => x.ContentValue.Contains(text)))
        .ToList();
    if (dataContent.Count > 0)
    {
        foreach (var item in dataContent)
        {
            list = _dbContext.CourseData
                .Where(r => r.Id == item.CourseDataId && 
                            r.OpenNow || 
                            r.Title.Contains(text) ||
                            r.Deck.Contains(text) ||
                            r.CourseCategori.SearchWord
                                .Split(new[] {",", ", ", "/"},
                                    StringSplitOptions
                                        .RemoveEmptyEntries) //online undervisning,undervisning,computer undervisning
                                .Any(x => x.Contains(text))).ToList(); //undervisning
        }
    }
    else
    {
        list = _dbContext.CourseData.Where(r => r.OpenNow &&
                            r.Title.Contains(text) ||
                            r.Deck.Contains(text) ||
                            r.Text.Contains(text) ||
                            r.CourseCategori.SearchWord
                                .Split(new[] {",", ", ", "/"},
                                    StringSplitOptions
                                        .RemoveEmptyEntries) //online undervisning,undervisning,computer undervisning
                                .Any(x => x.Contains(text))).ToList();
    }

    return list;
}

运行报错信息

LINQ表达式'DbSet .Join( outer: DbSet, inner: c => EF.Property(c, "CourseCategoriId"), outerKeySelector: c0 => EF.Property(c0, "Id"), innerKeySelector: (o, i) => new TransparentIdentifier<CourseData, CourseCategori>( Outer = o, Inner = i )) .Where(c => c.Outer.OpenNow && c.Outer.Title.Contains(__text_0) || c.Outer.Deck.Contains(__text_0) || c.Outer.Text.Contains(__text_0) || c.Inner.SearchWord.Split( separator: string[] { ",", ", ", "/", }, options: RemoveEmptyEntries) .Any(x => x.Contains(__text_0)))' 无法翻译。请将查询重写为可翻译形式,或通过显式插入AsEnumerable()、AsAsyncEnumerable()、ToList()、ToListAsync()调用切换到客户端评估。


内容的提问来源于stack exchange,提问作者J. Petersen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.03 17:54:04