在linq查询中使用split

时间:2013-11-18 19:53:28

标签: c# linq

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

value1, value2, value3

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

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

此外,值在commma之后按空格分隔。

我尝试使用以下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();

任何想法如何实现这一目标?

2 个答案:

答案 0 :(得分:6)

你没有正确地做Split,它应该是:

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

如果您想要Trim每个分割值,那么:

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

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

答案 1 :(得分:0)

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

有四次你会得到一场比赛,

  1. 前缀匹配 - 以
  2. 开头
  3. 内部匹配 - 包含
  4. 后缀匹配 - 以
  5. 结尾
  6. 唯一的匹配 - 只有一个项目,这就是它
  7. 考虑到我建议下面的解决方案 -

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