【发布时间】:2020-01-25 14:09:41
【问题描述】:
我正在尝试编写一个 Linq 查询来查找具有字符串属性 Tags 的项目,其中至少包含一个以逗号分隔的字符串 queryTags 中的单词。
属性Tags也是逗号分隔的字符串,值可以是“toy,ball,red,plastic”。
搜索字符串queryTags 可以是例如“red,ball”。在这种情况下,应该选择该项目,因为“red”和“ball”都匹配。
这是我目前所拥有的:
型号
public class WebContentsImage
{
public int Id { get; set; }
public string Tags { get; set; } // E.g. "toy,ball,red,plastic"
// some more properties
}
查询
List<WebContentsImage> Images = await db.WebContentsImages
.Where(t => t.Tags.Any(queryTags.Contains))
.ToListAsync()
.ConfigureAwait(false);
我真的不明白上面的查询应该做什么。我刚刚从this 答案中复制了它,希望它与我想要做的一致。无论如何,我从中得到了这个运行时异常:
NotSupportedException:无法解析表达式 't.Tags.Any(Convert(__CreateDelegate_0, Func`2))':给定的参数与预期的参数不匹配:'System.Linq.Expressions.UnaryExpression' 类型的对象不能转换为“System.Linq.Expressions.LambdaExpression”类型。
以前,我有这个:
List<WebContentsImage> Images = await db.WebContentsImages
.Where(t => t.Tags.Contains(queryTags.Split(",")))
.ToListAsync()
.ConfigureAwait(false);
...有这个编译时错误:
论据 1:无法从 string[] 转换为 char
还有这个(这是完全错误的):
List<WebContentsImage> Images = await db.WebContentsImages
.Where(t => t.Tags.Contains(queryTags, StringComparison.CurrentCultureIgnoreCase))
.ToListAsync()
.ConfigureAwait(false);
【问题讨论】:
-
如果标签和查询标签是字符串集合而不是 CSV 单个字符串,您的生活会更轻松。您愿意更改此设置还是必须保留 csv?
-
我同意。我将把我的模型改为有一个相关的标签表。
标签: c# linq asp.net-core entity-framework-core