【问题标题】:EF Core string contains string arrayEF Core 字符串包含字符串数组
【发布时间】:2021-02-12 02:25:35
【问题描述】:

是否可以使用 EF Core 检查字符串是否包含字符串[]

例如,我有一个数据库表,其中一列中有逗号分隔的关键字。我想获取也包含这些关键字的相关记录。我试过的方法:

public class Item {

  int Id { get; set; }

  string Keywords { get; set; }

}
var keywords = item.Keywords.Split(',');

var result = context.Items.Where(i => keywords.Any(j => i.Keywords.Contains(j)).ToListAsync();

这将引发错误消息:

LINQ 表达式 'DbSet().Where(g => __keywords_0.Any(j => g.Keywords.Contains(j)))' 无法翻译。

那么我将如何重写它以便可以将其转换为 SQL?获取完整列表并使用 C# 进行检查不是一种选择。也不可能将逗号分隔的关键字列表转换为它自己的表格。

【问题讨论】:

  • 你试过这个context.Items.Where(i => keywords.contains(i.Keywords).ToListAsync();@Roy Berris
  • @Eldho 不起作用,因为例如,“car,building,pool” (keywords) 不包含“apple,car,bike” (i.Keywords)
  • 您的关键字转换为字符串数组[],因此我们将每个项目与 i.keywords 进行比较,因此包含。汽车关键字包含在苹果、汽车、自行车(i.keywords)中,所以它不应该工作吗?
  • @Eldho 也没有,因为[ "car", "building", "pool"] (keywords) 不包含“apple,car,bike” (i.Keywords)。它需要匹配整个字符串。你的逻辑可以反过来工作,我在原帖中写过,但不能翻译成 SQL。
  • 你想让它转换成LIKE '%car,building,pool%'吗?如果记录有它但顺序不同:“游泳池、汽车、建筑”怎么办?

标签: c# entity-framework-core .net-5


【解决方案1】:

你可以使用这样的东西

public class Product
{
    public Int32 ID { get; set; }
    public List<StringList> Strings{ get; set; }

}

public class StringList
{
    public Int32 Id { get; set; }
    public String Name { get; set; }
}

List&lt;StringList&gt; 将替换 List&lt;String&gt;
例如DB.Products.Include(x =&gt; x.Strings).ToList().ForEach(y =&gt; Console.WriteLine(y.Name));

【讨论】:

  • 感谢您的回答,但我无法以帖子中描述的任何方式迁移数据库。所以不幸的是,这对我不起作用。
猜你喜欢
  • 2020-01-07
  • 1970-01-01
  • 2014-10-18
  • 2019-01-17
  • 2022-01-01
  • 2015-05-24
  • 2015-04-11
  • 1970-01-01
  • 2020-02-14
相关资源
最近更新 更多