Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类型“System.String[]”不支持比较运算符_C#_Linq_Linq To Sql_Exception - Fatal编程技术网

C# 类型“System.String[]”不支持比较运算符

C# 类型“System.String[]”不支持比较运算符,c#,linq,linq-to-sql,exception,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[]”不支持比较运算符 我怎样才能修好它? 谢谢。可能是conte

为什么选择这一行:

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

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

我怎样才能修好它?
谢谢。

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


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

那么您是在数据库中以空格分隔的列中从查询字符串中查找值?您使用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<Category>(p => p.Keywords.Split(' ').Contains<string>(context.Request.QueryString["q"])).First();

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

首先,我避免在数据库中存储分隔数据。正如您所发现的,它可能会使数据库查询等变得尴尬

如果你的分类数量有限,为了简单起见,我会同意乔的答案,否则,我会给马克的方法增加一些细节

为我使用的SQL Server创建拆分样式的UDF: 将其添加到您的DBML文件中 查询数据库,适当地引用UDF
然后,这将执行纯数据库端查询。

1列出您的var查询

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


祝你好运

刚刚检查过-没有。它以字符串的形式返回q1、q2、q3、q4、q5,而不是数组。HttpRequest.QueryString是一个NameValueCollection。NameValueCollection的索引器返回字符串--实际上-我也这么认为。但在发布前检查:将整个表读回给客户几乎总是一个坏主意。在某些情况下,它是有效的,但它们只是少数。事实上,它可能会对性能造成巨大的影响,但我们必须将这一点与普遍认为的预优化也不好的观点进行权衡。除了存在问题的大型项目外,可能还有无数的小型web应用程序,在这种情况下,对性能的影响微不足道。我想这只能归结为常识。

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

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;