类型’System.String ‘不支持比较运算符

为什么这一行:

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

抛出System.NotSupportedException:

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

我该如何解决? 谢谢。

那么您是在数据库中以空格分隔的列中查找值(来自查询字符串)? 您是否使用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)); 

LINQ-to-SQL不支持string.split

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

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

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

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

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

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

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

  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
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; 

然后,这将执行纯数据库端查询。

1)ToList()你的var查询

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

祝好运