Ich habe ein Viewmodel für die Statistik-Seite wie folgt erstellt:GroupBy komplexe Abfrage
public class StatsSeasonViewModel
{
public int player_id { get; set; }
public string player_name { get; set; }
public int games_played { get; set; }
public int total_first { get; set; }
public int total_second { get; set; }
public int total_third { get; set; }
public int total_wickets { get; set; }
public double avg_wickets { get; set; }
public int total_points { get; set; }
public double avg_points { get; set; }
}
ich eine komplexe LINQ-Anweisung haben, das Modell zu füllen. Ich empfinde dies einfacher sein könnte, aber ich weiß nicht, wie es zu tun:
const int first_place = 5;
const int second_place = 3;
const int third_place = 1;
var model =
from s in _db.Stats
join p in _db.Players
on s.player_id equals p.player_id
where s.season_id == current_season
select new StatsSeasonViewModel
{
player_id = p.player_id,
player_name = p.name,
games_played = (from st1 in _db.Stats
where st1.player_id == s.player_id
select st1).Count(),
total_first = (from st2 in _db.Stats
where st2.player_id == s.player_id && st2.place == 1
select st2).Count(),
total_second = (from st3 in _db.Stats
where st3.player_id == s.player_id && st3.place == 2
select st3).Count(),
total_third = (from st4 in _db.Stats
where st4.player_id == s.player_id && st4.place == 3
select st4).Count(),
total_wickets = (from st5 in _db.Stats
where st5.player_id == s.player_id
select st5.wickets).Sum(),
avg_wickets = (from st5 in _db.Stats
where st5.player_id == s.player_id
select st5.wickets).Sum()/
(from st1 in _db.Stats
where st1.player_id == s.player_id
select st1).Count(),
total_points = (from st5 in _db.Stats
where st5.player_id == s.player_id
select st5.wickets).Sum() +
(
(from st2 in _db.Stats
where st2.player_id == s.player_id && st2.place == 1
select st2).Count()
) * first_place +
(
(from st3 in _db.Stats
where st3.player_id == s.player_id && st3.place == 2
select st3).Count()
) * second_place +
(
(from st4 in _db.Stats
where st4.player_id == s.player_id && st4.place == 3
select st4).Count()
) * third_place,
avg_points = (
(from st5 in _db.Stats
where st5.player_id == s.player_id
select st5.wickets).Sum() +
(
(from st2 in _db.Stats
where st2.player_id == s.player_id && st2.place == 1
select st2).Count()
) * first_place +
(
(from st3 in _db.Stats
where st3.player_id == s.player_id && st3.place == 2
select st3).Count()
) * second_place +
(
(from st4 in _db.Stats
where st4.player_id == s.player_id && st4.place == 3
select st4).Count()
) * third_place
)/
(from st1 in _db.Stats
where st1.player_id == s.player_id
select st1).Count()
};
das größte Problem habe ich jetzt so ist, dass ich durch eine Gruppe tun müssen, auf diese Abfrage so, dass es nicht zeige Duplikate an. Aber wenn ich versuche, die Gruppe um hinzuzufügen, dann verliere ich den Rest der Abfrage nach dem SELECT. Wie kann ich eine Gruppe anhand der obigen Abfrage erstellen und die Ergebnisse erhalten, die ich brauche?
EDIT: FWIW ist hier die Ergebnisse erhalte ich: http://ecl.moyl.com/Home/Stats
Das zweite Problem ist natürlich die Komplexität der Abfrage selbst. Gibt es einen einfacheren Weg, dies zu tun?
Einen Enumerable Bereich von 1 bis 3 dann nur filtern wie dieser . Wo (st => range.Contains (st.place) & st.player_id = s.player_id) dann müssen Sie nach Ort gruppieren. Aber es könnte nur sinnvoller sein, all dies in einer Ansicht in Ihrer Datenbank zu sehen, so dass Sie einfach von dort greifen können. Aber du bekommst einen Upvote für deine Mühe –
Ha! Danke für die Verbesserung! Ich möchte nach Player_id gruppieren, nicht nach Ort. Gerade jetzt, was passiert ist, bekomme ich doppelte Einträge für alle Spieler. Ich habe versucht, Gruppen von s.player_id in statGroup zu addieren, aber dann bombardieren all die komplexen Sachen in der select-Anweisung, wenn ich versuche, das Modell zu bauen. Sie können mit der Erstellung einer Ansicht in der Datenbank recht haben - seltsamerweise habe ich das noch nie zuvor probiert! – xgrinderx
Sie könnten die Ansicht nützlicher finden, denn wenn alles richtig indexiert ist, müssen Sie nicht so viel Arbeit erledigen, um diese Abfrage herauszuziehen. Und Sie können diese Ansicht in Entitätsframework ziehen –