2010-08-26 13 views
11

Ich versuche, die folgende SQL-Linq 2 SQL zu konvertieren:Wie durch in Linq mit Gruppe verschieden verwenden, um SQL

select groupId, count(distinct(userId)) from processroundissueinstance 
group by groupId 

Hier ist mein Code:

var q = from i in ProcessRoundIssueInstance 
    group i by i.GroupID into g 
    select new 
    { 
     Key = g.Key, 
     Count = g.Select(x => x.UserID).Distinct().Count() 
    }; 

Wenn ich laufen Der Code, ich bekomme immer ungültige GroupID. Irgendwelche Ideen?

SELECT [t1].[GroupID] AS [Key], (
SELECT COUNT(*) 
FROM (
    SELECT DISTINCT [t2].[UserID] 
    FROM [ProcessRoundIssueInstance] AS [t2] 
    WHERE (([t1].[GroupID] IS NULL) AND ([t2].[GroupID] IS NULL)) 
     OR (([t1].[GroupID] IS NOT NULL) 
      AND ([t2].[GroupID] IS NOT NULL) 
      AND ([t1].[GroupID] = [t2].[GroupID])) 
    ) AS [t3] 
) AS [Count] 
FROM (
    SELECT [t0].[GroupID] 
    FROM [ProcessRoundIssueInstance] AS [t0] 
    GROUP BY [t0].[GroupID] 
    ) AS [t1] 
+0

@Basiclife: Was ist FUBAR darüber? In SQL ist NULL nichts, einschließlich NULL. Wenn beide NULL wären, wäre 't1.GroupID = t2.GroupId' immer noch falsch. Das ist die einzige Möglichkeit, zwei NULL-Felder zu verknüpfen. –

Antwort

0

Nach diesem Beitrag Ihr Code sieht richtig:

LINQ to SQL using GROUP BY and COUNT(DISTINCT)

Haben Sie versucht, Inspektion der die deutliche scheint, die Dinge ..

Hier ist die generierten SQL-Verschrauben SQL, das generiert wird?

+0

Ja, bitte sehen Sie sich meinen Originalbeitrag an, um den ungültigen sql zu sehen. – Marco

0

Es scheint eine ganze Menge Goop im generierten SQL zu geben, um mit der GroupID umzugehen, die NULL ist. Wenn das eine Möglichkeit? Wenn nicht, versuchen Sie, die Definition so zu ändern, dass sie NOT NULL ist.

0

eine where-Klausel Versuche unechte Ids nach dem Join ...

var q = from i in ProcessRoundIssueInstance 
    where i.GroupID != "" 
    group i by i.GroupID into g 
    select new 
    { 
     Key = g.Key, 
     Count = g.Select(x => x.UserID).Distinct().Count() 
    }; 
+0

Gleicher Fehler ... hmm – Marco

+0

Interessant, gibt es absichtlich eine Id-Spalte, die nULL-fähig ist? Können Sie uns auch den Datentyp für ProcessRoundIssueInstance gemäß dem Debugger (nicht Deklaration) angeben. Danke – Basic

+0

Ja, die GroupID ist Nullable, aber ich habe auch eine andere nicht NULL-Spalte versucht. System.Data.Linq.Table Marco

5

Ich denke Basiclife der Nähe, aber die Überprüfung zu beseitigen, wenn die ID nicht sein kann das Problem oder genug leer ist, sollten Sie überprüfen, Stellen Sie sicher, dass es vor dem Ausführen der Gruppe nicht null ist, da Sie angegeben haben, dass es sich um ein Nullwertfeld handelt. Ansonsten sieht es richtig aus, und wenn Sie Probleme haben, haben Sie möglicherweise schlechte Daten, oder es ist ein Fehler oder eine nicht vollständig implementierte Funktion von Linq to SQL, und Sie möchten vielleicht Linq to Entity ausprobieren.

var q = from i in ProcessRoundIssueInstance 
     where i.GroupID != null 
     && i.GroupID != string.Empty 
     group i by i.GroupID into g   
     select new 
     { 
      Key = g.Key, 
      Count = g.Select(x => x.UserID).Distinct().Count() 
     }; 
0

Sind Sie sich der korrekten Datenbankintegrität sicher? Wie auch immer, vielleicht solltest du Folgendes versuchen: Ich weiß nicht, wie eine Gruppe leer sein würde, aber das scheint dein Problem zu sein.

ProcessRoundIssueInstance.Where(i => i.GroupId != null) 
    .GroupBy(i => i.GroupID) 
    .Select(group => new 
        { 
         Key = group.Key, 
         Count = group.SingleOrDefault() == null ? 0 : 
           group.SingleOrDefault().Select(item => item.UserID).Distinct().Count() 
        });