【问题标题】:using split in linq query在 linq 查询中使用拆分
【发布时间】: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();

有什么想法可以实现吗?

【问题讨论】:

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

标签: c# linq


【解决方案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】:

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

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

  1. 前缀匹配 - 以
  2. 开头
  3. 内部匹配 - 包含与
  4. 后缀匹配 - 以
  5. 结尾
  6. 唯一的匹配 - 只有一项,就是这样

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

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 转换

猜你喜欢
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多