Laden...

Unterschiedliche bei Group By / Datenbank vs. Liste

Erstellt von micha0827 vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.191 Views
M
micha0827 Themenstarter:in
85 Beiträge seit 2015
vor 6 Jahren
Unterschiedliche bei Group By / Datenbank vs. Liste

verwendetes Datenbanksystem: MS SQL 2016

Ich habe eine Abfrage bei der ich mir das Ergebnis nicht erklären kann.
Ich brauche Daten aus einer Datenbank, einmal komplett und einmal gruppiert.
Folgende 2 Abfragen wollte ich dafür verwenden:


var ergebnis = (from a in tabelle1
join b in tabelle2 on a.globalID equals b.id
where a.aktiv == null
orderby a.id
select new
{
id = a.id,
keywords = a.keywords,
artikelnummer = a.artikelnummer,
globalID = b.GlobalID
}).ToList();

var groupedList = (from a in ergebnis
group a by new { keywords = a.keywords, globalID = a.globalID } into g
orderby g.Key.keywords
select new { keywords = g.Key.keywords, globalID = g.Key.globalID })
.Skip(0)
.Take(5000)
.ToList();

Problem ist dass die gruppierte Liste 200 Ergebnisse mehr bringt als die gruppierte Abfrage in der DB selbst, bei 6000 (die Menge stimmt) Ergebnissen ohne Gruppierung. Hier die gruppierte Abfrage aus der DB:


var db_group = (from b in tabelle1
join c in tabelle2 on b.globalID equals c.id
where b.aktiv == null
group b by new { keywords = b.keywords, globalID = c.GlobalID } into g
orderby g.Key.keywords
select new { keywords = g.Key.keywords, globalID = g.Key.globalID })
.Skip(0)
.Take(5000)
.ToList();

Hat jemand eine Erklärung ?
Michael

J
641 Beiträge seit 2007
vor 6 Jahren

und was nimmst du für einen linq provider? entita framework?
vlt. stimmt auch der erzeugte sql nicht.

cSharp Projekte : https://github.com/jogibear9988

6.911 Beiträge seit 2009
vor 6 Jahren

Hallo micha0827,

eine genau Antwort kann ich dir leider nicht liefern, dazu fehlt mir das Wissen über deine Tabellen / Objekte.

Aber im oberen Snippet führt das Gruppieren Linq durch und im unteren der SQL Server.

Linq verwendet zum Gruppieren GetHashCode (bzw. IEqualityComparer<T>), hier der eines anonymen Typen.
SQL Server macht es grundsätzlich ähnlich, wie genau weiß ich nicht.
Aber da werden sich wohl beide Unterscheiden und deshalb sind die Ergebnisse anders.

Anstatt des anonymen Typen kannst du eine benannten Typen verwenden und dort entweder IEquality<T> implementieren od. bei GroupBy (als Erweiterungsmethode) eine Instanz von IEqualityComparer<T> angeben.

Sollte aber das Ergebnis mit Gruppierung in der DB das korrekte sein, so kannst du auch dieses verwenden.

BTW: das Skip(0) kannst du weglassen. Genauso das orderby vor dem Gruppieren, denn beim Gruppieren wird die Reihenfolge ohnehin über den Haufen geschmissen.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

W
955 Beiträge seit 2010
vor 6 Jahren

Aber da werden sich wohl beide Unterscheiden und deshalb sind die Ergebnisse anders. Prüfe mal ob Keywords einmal case-sensitive und einmal case-insensitive gruppiert wird