在 linq 查询中使用拆分

Posted

技术标签:

【中文标题】在 linq 查询中使用拆分【英文标题】:using split in linq query 【发布时间】:2013-12-02 02:54:09 【问题描述】:

在我的一个数据库字段中,我的数据如下:

value1, value2, value3

我的搜索参数可以是 value1 或 value2 或 value3

我想要做的是使用 linq 查询来获取实体列表,例如value2 在 "value1, value2, value3" 中

另外,值在逗号后用空格分隔。

我尝试使用以下 linq 查询,但收到一个错误,指出不允许进行数组操作。

List<Players> c = (from p in db.Players
                      where (p.Users == "Everyone" || p.Users.Split()[','].Trim().Contains(username))
                      orderby p.Category ascending
                      select p).ToList();

有什么想法可以实现吗?

【问题讨论】:

也不行,同样的错误。 您应该在相关答案上发表评论,以便回答者收到通知。您现在遇到的错误是什么,不可能是相同的错误。 【参考方案1】:

你没有正确执行Split,应该是这样的:

p.Users.Split(',').Contains(username)

如果你想Trim每个拆分值那么:

p.Users.Split(',').Select(r=> r.Trim).Contains(username)

如果您使用的是 LINQ to Entities,那么您最终可能会遇到 string.Split 无法转换为 SQL 查询的异常。在这种情况下,您可能必须先迭代 (ToList) 您的结果,然后将其与拆分数组进行比较。

【讨论】:

这在 ASP.NETCore 中不再有效,它会抛出“表达式树可能不包含使用可选参数的调用或调用”【参考方案2】:

首先,在需要字符串拆分匹配的情况下使用数据模型并不是一个好习惯。因为它会导致系统效率低下,更不用说慢查询了。但是,如果您真的需要解决方案,为什么不试试这个 -.

有四种情况你会得到匹配,

    前缀匹配 - 以开头 内部匹配 - 包含与 后缀匹配 - 以结尾 唯一的匹配 - 只有一项,就是这样

考虑到这种情况,我建议以下解决方案 -

username is the value looking for say "1"
string prefixMatch = username + ",";
string suffixMatch = ", " + username;
string innerMatch = ", " + username + ",";

List<Players> c = (from p in db.Players
                  where (p.Users == "Everyone" || (p.StartsWith(prefixMatch) ||
                                                   p.Contains(innerMatch) || p.EndsWith(suffixMatch) || 
                                                   (!p.Contains(",") && p == username)))
                  orderby p.Category ascending
                  select p).ToList();

此查询将支持 LINQ-TO-SQL 转换

【讨论】:

可能重复 - ***.com/questions/23511565/linq-select-using-split/…

以上是关于在 linq 查询中使用拆分的主要内容,如果未能解决你的问题,请参考以下文章

Linq 到嵌套列表

有没有办法将简单的 LINQ 查询封装在可与 LINQ to Entities 查询一起使用的扩展方法中?

在 LINQ 查询上使用“包含”方法时出错

C#3.0中的新增功能09 LINQ 04 基本 LINQ 查询操作

在 C# 中使用组和连接进行 LINQ 查询

使用 LLBLGen 时如何在 Linq 查询中进行全文搜索