将数组存储为逗号分隔,如何使用 LINQ 进行查询?

Posted

技术标签:

【中文标题】将数组存储为逗号分隔,如何使用 LINQ 进行查询?【英文标题】:Storing an Array as comma separated, how to query with LINQ? 【发布时间】:2020-08-07 14:11:07 【问题描述】:

我使用 EF Core 的 HasConversion 函数将 List<string> 作为逗号分隔值存储在 SQL 数据库中。我很欣赏它的简单性,但现在我正在努力查询这个属性。现在我通过从数据库中检索记录后过滤来解决这个问题,但我更愿意改进查询。如何编写我的 LINQ 查询,以便 EF Core 可以将其转换为 SQL 语句?

属性:

public List<string> AccountTypes  get; set; 

DB上下文中的配置:

modelBuilder.Entity<Account>().Property(c => c.AccountTypes).HasConversion(
        t => string.Join(',', t),
        t => t.Split(',', StringSplitOptions.RemoveEmptyEntries));

转换为SQL失败的示例查询:

IQueryable<Account> query = context.Accounts.Where(a => a.AccountTypes.Any(t => t == "A")).AsQueryable();

错误信息:

无法翻译 LINQ 表达式。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估。

我阅读了与客户端与服务器评估相关的Microsoft article,但我不认为使用客户端评估比我当前仅在数据库查询返回后过滤结果的解决方法有任何好处。我的期望是,插入任何建议的调用都会在此时执行 SQL,返回一个大子集,然后才在 AccountTypes 上应用过滤器。

【问题讨论】:

您可能必须开始以不同的方式存储列表。拆分不能作为 SQL 查询的一部分进行。 谢谢。在这种情况下,我将继续解决问题,如果性能受到显着影响,我将以不同的方式存储列表。 请随意发布关于无法在 SQL 查询中拆分字符串的答案。 【参考方案1】:

Herohtar 在评论中提供了答案:

您可能必须开始以不同的方式存储列表。拆分不能作为 SQL 查询的一部分进行。

【讨论】:

以上是关于将数组存储为逗号分隔,如何使用 LINQ 进行查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 LINQ 查找包含 2 个逗号分隔的字符串的匹配项

使用嵌套数组将 JSON 转换为逗号分隔的字符串

在 linq 查询中使用拆分

如何从数据库中获取逗号分隔值

如何将 PHP 数组表示为逗号分隔的字符串? [复制]

如何将逗号分隔的字符串转换为数组?