LINQ to SQL à l'aide de GROUPE PAR et COUNT(DISTINCT)
J'ai pour exécuter la requête SQL suivante:
select answer_nbr, count(distinct user_nbr)
from tpoll_answer
where poll_nbr = 16
group by answer_nbr
Le LINQ to SQL de la requête
from a in tpoll_answer
where a.poll_nbr = 16 select a.answer_nbr, a.user_nbr distinct
cartes à la requête SQL suivante:
select distinct answer_nbr, distinct user_nbr
from tpoll_answer
where poll_nbr = 16
Donc bon. Cependant, le problème soulève lors de la tentative de regrouper les résultats, que je suis de ne pas être en mesure de trouver un LINQ to SQL de la requête qui correspond à la première requête que j'ai écrit ici (merci LINQPad pour rendre ce processus beaucoup plus facile). Ce qui suit est le seul que j'ai trouvé qui me donne le résultat souhaité:
from answer in tpoll_answer where answer.poll_nbr = 16 _
group by a_id = answer.answer_nbr into votes = count(answer.user_nbr)
Qui à son tour produit de l'follwing laid et non optimisé à tous les requête SQL:
SELECT [t1].[answer_nbr] AS [a_id], (
SELECT COUNT(*)
FROM (
SELECT CONVERT(Bit,[t2].[user_nbr]) AS [value], [t2].[answer_nbr], [t2].[poll_nbr]
FROM [TPOLL_ANSWER] AS [t2]
) AS [t3]
WHERE ([t3].[value] = 1) AND ([t1].[answer_nbr] = [t3].[answer_nbr]) AND ([t3].[poll_nbr] = @p0)
) AS [votes]
FROM (
SELECT [t0].[answer_nbr]
FROM [TPOLL_ANSWER] AS [t0]
WHERE [t0].[poll_nbr] = @p0
GROUP BY [t0].[answer_nbr]
) AS [t1]
-- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [16]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1
Toute aide sera plus apprécié.
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de support direct pour
COUNT(DISTINCT {x}))
, mais vous pouvez le simuler à partir d'unIGrouping<,>
(c'est à dire ce quegroup by
retours); j'ai peur qu'à "faire" de C#, de sorte que vous aurez à traduire pour VB...Voici un exemple Northwind:
Le TSQL n'est pas tout à fait ce que nous aimerions, mais il fait le travail:
Les résultats, cependant, sont corrects - verifyable en exécutant manuellement:
Avec définition:
Les Comptoirs exemple cité par Marc Gravel peut être réécrite avec la Ville de la colonne sélectionnée directement par la déclaration du groupe:
Linq to sql n'a pas de support pour Count(Distinct ...). Par conséquent, vous devez mapper un .NET de la méthode dans le code sur une fonction Sql server (donc Count(distinct.. )) et l'utiliser.
btw, il n'aide pas si vous publiez des pseudo-code copié à partir d'une boîte à outils dans un format qui n'est ni VB.NET ni C#.
C'est comment vous faire un compte distinct de la requête. Notez que vous devez filtrer les valeurs null.
Si vous combinez cela avec dans votre code de regroupement, je pense que vous aurez votre solution.
simple et propre exemple de la façon dont le groupe dans les œuvres de LINQ
http://www.a2zmenu.com/LINQ/LINQ-to-SQL-Group-By-Operator.aspx
packages.GroupBy(p => p.OrderId).Count()
Je ne serais pas la peine de faire dans Linq2SQL. Créer une Procédure stockée pour la requête que vous voulez et de les comprendre, puis de créer l'objet de la procédure stockée, dans le cadre ou tout simplement se connecter directement à elle.