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
und was nimmst du für einen linq provider? entita framework?
vlt. stimmt auch der erzeugte sql nicht.
cSharp Projekte : https://github.com/jogibear9988
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!"
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