类型'System.String []'不支持比较运算符

时间:2009-07-31 11:01:28

标签: c# linq linq-to-sql exception

为什么这一行:

var category = _dataContext.Categories.Where<Category>(p => p.Keywords.Split(' ').Contains<string>(context.Request.QueryString["q"])).First();

抛出System.NotSupportedException:

  

类型'System.String []'

不支持比较运算符

我该如何解决? 感谢。

5 个答案:

答案 0 :(得分:4)

所以你在数据库中以空格分隔的列中寻找一个值(来自查询字符串)?您正在使用Split来查询数据库中的各个值吗?

(只是检查我的假设......)

以这种方式不支持

string.Split(在列数据的数据库中) - 请参阅此处查看supported string operations。 (请注意,string.Split 明确不受支持)。

我很懒;当我在数据库中划分数据时(相对罕见),我总是在数据的开头和结尾添加相同的分隔符;然后我可以搜索:

string searchFor = DELIMITER + searchValue + DELIMITER;
...
.Where(row => row.Value.Contains(searchFor));

然而;在这种情况下,我希望最实用的选项可能是编写一个UDF函数来搜索分隔的varchar(正确处理第一个/最后一个项目),并在数据上下文中公开UDF - 然后使用:< / p>

.Where(row => ctx.ContainsValue(row.Value, searchValue)); // ContainsValue is our UDF

或 - 规范化数据......

.Where(row => row.Values.Any(s=>s.Value == searchValue));

答案 1 :(得分:3)

LINQ-to-SQL不支持

string.split

有一个简单的解决方法。选择所有数据并在客户端中进行过滤。根据类别的数量,这可能效率不高。

var category = 
    _dataContext.Categories.ToList()
    .Where<Category>(p => p.Keywords.Split(' ').Contains<string>(context.Request.QueryString["q"])).First();

调用.ToList()将强制枚举数据源中的所有类别,后续操作将在客户端代码中执行。

答案 2 :(得分:0)

可能是context.Request.QueryString["q"]返回字符串数组而不是单个字符串的情况。这是因为url可能包含多个具有相同名称的参数。

如果您确定请求中始终只有一个名为q的参数,则可以将代码更改为:context.Request.QueryString["q"].SingleOrDefault()

答案 3 :(得分:0)

首先,我要避免在数据库中存储分隔数据。正如您所知,它可以使数据库查询等尴尬。

如果您的类别数量有限,我会简单地回答Joe的答案,否则,为Marc的方法添加一些细节。

  1. 为我使用的SQL Server创建一个拆分式UDF:
  2. 
    CREATE FUNCTION FN_CHARLIST_TO_TABLE
     (@list      nvarchar(MAX),
      @delimiter nchar(1) = N',')
    RETURNS @tbl TABLE (listpos int IDENTITY(1, 1) NOT NULL,
                  str     varchar(4000)      NOT NULL,
                  nstr    nvarchar(2000)     NOT NULL) AS
    /*                
      Comments:
            - Takes a CSV string, and creates a table of data from this
            - Each item takes one row in the following format
                listpos - the index of the item in the string (effectively a row number in the output)
                str - The value, as VARCHAR
                nstr - The value, as NVARCHAR
    
            - This function is a direct extract from http://www.sommarskog.se/arrays-in-sql-2005.html#iter-list-of-strings
    Usage:
        SELECT * 
        FROM  t 
        JOIN FN_CHARLIST_TO_TABLE('a,b,c,1,2,3', ',') list
        ON t.Name = list.str        
    */
    BEGIN
       DECLARE @endpos   int,
           @startpos int,
           @textpos  int,
           @chunklen smallint,
           @tmpstr   nvarchar(4000),
           @leftover nvarchar(4000),
           @tmpval   nvarchar(4000)
    
       SET @textpos = 1
       SET @leftover = ''
       WHILE @textpos  0
          BEGIN
         SET @tmpval = ltrim(rtrim(substring(@tmpstr, @startpos + 1,
                             @endpos - @startpos - 1)))
         INSERT @tbl (str, nstr) VALUES(@tmpval, @tmpval)
         SET @startpos = @endpos
         SET @endpos = charindex(@delimiter COLLATE Slovenian_BIN2,
                     @tmpstr, @startpos + 1)
          END
    
          SET @leftover = right(@tmpstr, datalength(@tmpstr) / 2 - @startpos)
       END
    
       INSERT @tbl(str, nstr)
          VALUES (ltrim(rtrim(@leftover)), ltrim(rtrim(@leftover)))
       RETURN
    END
    
    
    1. 将此添加到您的DBML文件
    2. 查询数据库,适当引用UDF
    3. 
      var catergories = from cat in _datacontext.Categories
                        from keyword in _datacontext.FN_CHARLIST_TO_TABLE(cat.Keywords, ' ')
                        where keyword.str == context.Request.QueryString["q"]
                        select cat;
      

      然后执行纯粹的数据库端查询。

答案 4 :(得分:-2)

1)ToList()你的var查询

2)在1步生成的列表中编写包含和拆分查询:它正确执行

祝你好运