Opérateurs de comparaison non pris en charge pour le type ‘System.Ssortingng ‘

pourquoi cette ligne:

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

lève une exception System.NotSupportedException:

Opérateurs de comparaison non pris en charge pour le type ‘System.Ssortingng []’

Et comment puis-je résoudre ce problème? Merci.

Vous recherchez donc une valeur (à partir de la chaîne de requête) dans une colonne de la firebase database délimitée par des espaces? Et vous utilisez Split pour interroger les valeurs individuelles dans la firebase database?

(vérifiant juste mes hypothèses …)

ssortingng.Split n’est pas pris en charge de cette manière (dans la firebase database sur les données de colonne) – voir ici pour les opérations de chaîne sockets en charge . (notez que ssortingng.Split n’est pas explicitement supporté).

Je suis fainéant; lorsque je délimite des données dans la firebase database (relativement rare), j’ajoute toujours le même délimiteur au début et à la fin des données; alors je peux juste chercher:

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

Toutefois; dans ce cas, je pense que l’option la plus pratique pourrait être d’écrire une fonction UDF qui recherche un varchar délimité (en gérant correctement le premier / dernier élément) et d’exposer l’UDF sur le contexte de données – utilisez ensuite:

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

Ou – normaliser les données …

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

ssortingng.split n’est pas pris en charge dans LINQ-to-SQL.

Il y a une solution facile. Sélectionnez toutes les données et effectuez le filtrage dans le client. Cela peut ne pas être très efficace en fonction du nombre de catégories.

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

L’appel de .ToList() forcera l’énumération de toutes les catégories de votre source de données et les opérations suivantes seront effectuées dans le code client.

C’est probablement le cas que context.Request.QuerySsortingng["q"] renvoie un tableau de chaînes au lieu d’une seule chaîne. En effet, une URL peut contenir plusieurs parameters portant le même nom.

Si vous êtes sûr qu’il n’y a toujours qu’un seul paramètre nommé q dans la demande, vous pouvez modifier votre code comme context.Request.QuerySsortingng["q"].SingleOrDefault() .

Premièrement, j’éviterais de stocker des données délimitées dans la firebase database. Comme vous l’avez découvert, cela peut rendre les requêtes sur la firebase database, etc.

Si vous avez un nombre limité de catégories, j’irais avec la réponse de Joe pour plus de simplicité, sinon, en ajoutant quelques détails à l’approche de Marc.

  1. Créer une UDF de style divisé pour SQL Server, j’utilise:
 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 ssortingng, 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 ssortingng (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-ssortingngs 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 = lsortingm(rsortingm(subssortingng(@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 (lsortingm(rsortingm(@leftover)), lsortingm(rsortingm(@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 ssortingng, 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 ssortingng (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-ssortingngs 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 = lsortingm(rsortingm(subssortingng(@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 (lsortingm(rsortingm(@leftover)), lsortingm(rsortingm(@leftover))) RETURN END 
  1. Ajoutez ceci à votre fichier DBML
  2. Interrogez votre firebase database en référençant correctement la fonction UDF
 var catergories = from cat in _datacontext.Categories from keyword in _datacontext.FN_CHARLIST_TO_TABLE(cat.Keywords, ' ') where keyword.str == context.Request.QuerySsortingng["q"] select cat; 

Ceci exécutera alors une requête purement firebase database.

1) ToList () votre requête var

2) Dans la liste générée en 1 étape, écrivez votre requête contient et divise: elle s’exécute correctement

bonne chance