Linq distinct ne fonctionne pas correctement

J’ai un problème étrange avec une requête linq. J’utilise LINQPad 4 pour créer une requête utilisant une expression régulière en utilisant LinqToSQL comme pilote LinqPad.

Voici la requête que j’essaie de faire:

(from match in from s in SystemErrors select Regex.Match(s.Description, "...") select new { FamilyCode = match.Groups["FamilyCode"].Value, ProductPrefix = match.Groups["ProductPrefix"].Value, BillingGroup = match.Groups["BillingGroup"].Value, Debtor = match.Groups["Debtor"].Value }).Distinct() 

Comme vous pouvez le constater, j’essaie d’extraire des données d’une description textuelle dans une table de journal à l’aide de groupes. La requête fonctionne, mais Distinct ne veut pas fonctionner, elle renvoie une ligne pour toutes les correspondances.

J’ai lu que distinct devrait fonctionner avec un type anonyme, correspondant à chaque propriété. Encore plus étrange est que distinct fait réellement quelque chose, il ordonne les valeurs par ordre alphabétique par le FamilyCode (puis par ProductPrefix, etc.).

Quelqu’un a une idée sur pourquoi cela ne fonctionne pas? Merci

Voici ce qui est affiché dans l’onglet SQL de LinqPad:

 DECLARE @p0 NVarChar(1000) = 'Big Regexp' DECLARE @p1 NVarChar(1000) = 'FamilyCode' DECLARE @p2 NVarChar(1000) = 'ProductPrefix' DECLARE @p3 NVarChar(1000) = 'BillingGroup' DECLARE @p4 NVarChar(1000) = 'Debtor' SELECT DISTINCT [t2].[Description] AS [input], [t2].[value], [t2].[value2], [t2].[value3], [t2].[value4], [t2].[value5] FROM ( SELECT [t1].[Description], [t1].[value], @p1 AS [value2], @p2 AS [value3], @p3 AS [value4], @p4 AS [value5] FROM ( SELECT [t0].[Description], @p0 AS [value] FROM [SystemError] AS [t0] ) AS [t1] ) AS [t2] 

 var result = from eachError in SystemErrors let match = Regex.Match(eachError.Description, "...") group eachError by new { FamilyCode = match.Groups["FamilyCode"].Value, ProductPrefix = match.Groups["ProductPrefix"].Value, BillingGroup = match.Groups["BillingGroup"].Value, Debtor = match.Groups["Debtor"].Value } into unique select unique.key; 

Lorsque vous utilisez Distinct() , il est distingué par un pointeur sur chaque object et non par une valeur, car select new {} est un type d’object et non un type de valeur. Essayez d’utiliser group by à la place.

D’autre part, vous pouvez utiliser la .Distinct(IEqualityComparer) et fournir EqualityComparer à l’object que vous souhaitez traiter.