不支持类型的比较操作符“System.String []”(Comparison operators

2019-06-27 09:22发布

为什么这行:

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

抛出System.NotSupportedException:

不支持类型的比较操作符“System.String []”

我该如何解决? 谢谢。

Answer 1:

所以,你正在寻找(从查询字符串)在数据库中的空间分隔的列中的值? 而你正在使用Split来查询数据库内的各个值?

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

string.Split在这里看到的-不以这种方式(在对列数据的数据库)支持支持字符串操作 。 (请注意, string.Split 明确不支持)。

我很懒; 当我在数据库中(比较少见)限定的数据,我总是添加相同的分隔符的开始和数据结束; 然后我可以只搜索:

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

然而; 在这种情况下,我希望最实际的选择可能是写一个UDF功能,搜索分隔varchar (正确处理第一/最后一个项目),揭露了UDF的数据上下文-然后使用:

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

或者 - 数据标准化...

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


Answer 2:

string.split没有在LINQ到SQL支持。

这里有一个简单的办法。 选择所有的数据,并做过滤的客户端。 这取决于类别的数量可能不是非常有效。

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

调用.ToList()将迫使所有类别的枚举从您的数据源,而随后的操作将在客户端代码执行。



Answer 3:

这可能是案件context.Request.QueryString["q"]返回一个字符串数组,而不是一个字符串。 这是因为网址可能包含多个同名的参数。

如果您确信始终有要求仅仅为q一个参数,您可以更改您的代码如下: context.Request.QueryString["q"].SingleOrDefault()



Answer 4:

首先,我会避免在数据库中存储分隔的数据。 正如你已经发现了它可以使数据库查询等尴尬。

如果您有类别的限制量,我与乔的回答为简单起见,别的去了,增加了一些细节,以马克的做法。

  1. 创建拆分式UDF,对于SQL Server使用:

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

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;

那么这将执行一个纯粹的数据库方面的查询。



Answer 5:

1)ToList()您的VAR查询

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

祝好运



文章来源: Comparison operators not supported for type 'System.String[]'