在 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 to Entities 查询一起使用的扩展方法中?