Frapper le 2100 limite de paramètre (SQL Server) lors de l'utilisation de Contains()
from f in CUSTOMERS
where depts.Contains(f.DEPT_ID)
select f.NAME
depts
est une liste (IEnumerable<int>
) du ministère de l'ids
Cette requête fonctionne très bien jusqu'à ce que vous passez une grande liste (disons, autour de 3000 dept id) .. alors, j'obtiens cette erreur:
Les entrants (tabular data stream) appel de procédure distante (RPC) du protocole de flux est incorrect. Trop de paramètres ont été fournis dans cette demande de RPC. Le maximum est de 2100.
J'ai changé ma requête à:
var dept_ids = string.Join(" ", depts.ToStringArray());
from f in CUSTOMERS
where dept_ids.IndexOf(Convert.ToString(f.DEPT_id)) != -1
select f.NAME
à l'aide de IndexOf()
correction de l'erreur, mais fait la requête lente. Est-il un autre moyen pour résoudre ce problème? merci beaucoup.
- Que diriez - comme (dont les lots en morceaux maniables). Les autres (non-LINQ) options CSV et un "split" de l'UDF, et la table des paramètres (dans SQL2008).
- Marque, pouvez-vous nous expliquer quelle est la meilleure alternative à
contain
si j'ai des divers paramètres de compter de 1 à 2000? Je sais que cela créer des tas de plans en db, mais il semble que l'utilisation de lalike <input parameter> '%<search field>%'
prendra même plus la ressource de base de données en temps. Que dois-je utiliser? - Le 2100 paramètre le problème de la limite n'existe pas dans le Cadre de l'Entité: stackoverflow.com/questions/8898564/...
- avez-vous essayé une solution? pas marqué aucun
- Qu'en est-il de la recherche pour
DEPT_id
quand est égal à 1, trouverez tout les id 1 dans n'importe quel chiffre! Ai-je raté quelque chose?
Vous devez vous connecter pour publier un commentaire.
Ma solution (Guides -> Liste des Guid):
Pourquoi ne pas écrire la requête sql et de joindre votre entité?
Il a été un certain temps depuis que j'ai travaillé dans Linq, mais va ici:
Bien sûr, vous devez les protéger contre les injections, mais cela ne devrait pas être trop dur.
Vous voulez vérifier la LINQKit projet depuis l'intérieur, quelque part, est une technique de dosage de tels états pour résoudre ce problème. Je crois que l'idée est d'utiliser le PredicateBuilder pour briser la collection locale dans les petites formes de packets mais je n'ai pas revu la solution en détail, car j'ai plutôt été à la recherche d'un moyen plus naturel pour gérer cela.
Malheureusement, il semble de La réponse de Microsoft à ma suggestion pour résoudre ce problème qu'il n'existe pas de plans pour avoir cette abordées .NET Framework 4.0 ou encore les service packs ultérieurs.
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=475984
Mise à JOUR:
J'ai ouvert une discussion quant à savoir si cela allait être fixé pour LINQ to SQL ou la ADO.NET Entity Framework sur les forums MSDN. Veuillez voir ces messages pour plus de renseignements sur ces sujets et voir la solution temporaire que j'ai trouvé avec l'aide de XML et SQL UDF.
J'ai eu le même problème, et j'ai deux solutions pour y remédier.
Pour obtenir des valeurs qui ne sont PAS dans la liste, j'ai utilisé Sauf méthode OU une jointure gauche.
Mise à jour
EntityFramework 6.2 exécute la requête suivante avec succès:
Vous avez toujours la possibilité de partitionner votre liste de depts en ensembles plus petits avant de les passer en paramètres à la DANS la déclaration généré par Linq. Voir ici:
Diviser un grand IEnumerable en petits IEnumerable d'un montant fixe de l'élément