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
相关产品推荐
相关产品推荐

