LinqTo Sql OrderBy не имеет эффекта - PullRequest
0 голосов
/ 05 февраля 2020

Я использую LinqTo Sql -DataSource для GridView следующим образом:

                wsv.wsv2DataContext db = new wsv.wsv2DataContext();
                e.KeyExpression = "id";
                e.QueryableSource = (from mitgliedschaft in db.mitgliedschaft

                                     join person in db.person on mitgliedschaft.person_id equals person.id
                                     join institution in db.institution on mitgliedschaft.verein_id equals institution.id

                                     select new
                                     {
                                         vorname = person.vorname,
                                         nachname = person.nachname,
                                         nameVerein = institution.name,
                                         vereinid = mitgliedschaft.verein_id,
                                         id = mitgliedschaft.id,
                                         verbandsMitgliedsNummer = person.verbandsMitgliedsNummer,
                                         strasse = person.strasse,
                                         plz = person.plz,
                                         ort = person.ort,
                                         geburtsdatum = person.geburtsdatum,
                                         geschlechtid = person.geschlechtid,
                                         statusid = mitgliedschaft.statusid,
                                         bezirk_id = mitgliedschaft.bezirk_id,
                                         kreis_id = mitgliedschaft.kreis_id,
                                         person_id = mitgliedschaft.person_id.Value,
                                         deletedFlag = mitgliedschaft.deletedFlag,
                                         stammverein = mitgliedschaft.stammVerein,
                                         eintrittsdatum = mitgliedschaft.eintritt
                                     }).GroupBy(p => p.person_id).Select(p => p.First());
            }

Теперь я хочу заказать Выбор. Сначала нисходящий столбец «stammVerein» таблицы «mitgliedschaft» И столбец «eintritt» таблицы «mitgliedschaft». Я пробовал несколько способов:

                wsv.wsv2DataContext db = new wsv.wsv2DataContext();
                e.KeyExpression = "id";
                e.QueryableSource = (from mitgliedschaft in db.mitgliedschaft

                                     join person in db.person on mitgliedschaft.person_id equals person.id
                                     join institution in db.institution on mitgliedschaft.verein_id equals institution.id

                                     orderby mitgliedschaft.stammVerein descending, mitgliedschaft.eintritt

                                     select new
                                     {
                                         ...

                                     }).GroupBy(p => p.person_id).Select(p => p.First());
            }

И:

                wsv.wsv2DataContext db = new wsv.wsv2DataContext();
                e.KeyExpression = "id";
                e.QueryableSource = (from mitgliedschaft in db.mitgliedschaft

                                     join person in db.person on mitgliedschaft.person_id equals person.id
                                     join institution in db.institution on mitgliedschaft.verein_id equals institution.id

                                     select new
                                     {
                                         ...

                                     }).GroupBy(p => p.person_id).Select(p => p.First()).OrderByDescending(stamm => stamm.stammverein).ThenBy(eintritt => eintritt.eintrittsdatum);
            }

И:

                wsv.wsv2DataContext db = new wsv.wsv2DataContext();
                e.KeyExpression = "id";
                e.QueryableSource = (from mitgliedschaft in db.mitgliedschaft

                                     join person in db.person on mitgliedschaft.person_id equals person.id
                                     join institution in db.institution on mitgliedschaft.verein_id equals institution.id

                                     select new
                                     {
                                         ....

                                     }).OrderByDescending(stamm => stamm.stammverein).ThenBy(eintritt => eintritt.eintrittsdatum).GroupBy(p => p.person_id).Select(p => p.First());

Но ничего из этого не имеет никаких эффектов! Я очень новичок в этом виде DataSource и Linq.

Может кто-нибудь помочь мне в достижении этого порядка?

1 Ответ

0 голосов
/ 06 февраля 2020

Элементы внутри сгруппированного результата не сохранят свой порядок. В зависимости от того, как вы хотите учитывать порядок, вам нужно будет сделать это после группы, до и / или после вашего First ...

Чтобы выполнить sh, будет проще, если вы сопоставите отношения в EF со свойствами навигации, а не замените SQL на Linq QL (объединения и т. д.)

Используя следующий базовый запрос:

var query = db.mitgliedschaft
    .GroupBy(m => m.Person); // Group by related entity, not ID

Например, после группирования у вас будут наборы записей, сгруппированных по Person. Если вам нужен первый человек с самой ранней связанной записью:

var result = query.OrderByDescending(g => g.Key.mitgliedschafts.Max(stamm => stamm.stammverein)
    .ThenBy(stamm => stamm.eintritt.eintrittsdatum)
    .First();

Это дикая догадка относительно ваших отношений между схемой и сущностью, но, надеюсь, это поможет вам найти что-то подходящее. Я могу только догадываться, что такое eintritt и как он соотносится с вашей моделью сущности.

Первоначальный запрос берет только ваши базовые сущности, которые вы хотите сгруппировать, и группирует их по связанной сущности. Результатом этой группировки будет набор сгруппированных mitgliedschafts, ключом которого является Person. Чтобы упорядочить эти группы лицом с самыми последними mitgliedschafts, мы используем orderby для связанных mitgliedschafts Ключа, используя значение Max для коллекции с учетом запроса в порядке убывания.

Затем First дает нам первая сгруппированная коллекция mitgliedschafts.

Затем, если вы хотите отсортировать итоговый список mitgliedschafts после получения человека с самым последним:

var result = query.OrderByDescending(g => g.Key.mitgliedschafts.Max(stamm => stamm.stammverein)
    .ThenBy(stamm => stamm.eintritt.eintrittsdatum)
    .First().OrderByDescending(stamm => stamm.stammverein)
    .ThenBy(stamm => stamm.eintritt.eintrittsdatum)
    .ToList();

2-й набор предложений OrderBy применяется к выбранной группы или mitgliedschafts.

Чтобы создать нужную модель представления, вставьте Select(), чтобы построить модель представления из mitgliedschafts до ToList().

со свойствами навигации. это, вероятно, может быть сделано без обращения к группе. По догадкам, что-то вроде этого должно возвращать что-то похожее:

var query = db.Person
    .OrderByDescending(p => p.mitgliedschafts.Max(stamm => stamm.stammverien))
    .ThenBy(stamm => stamm.eintritt.eintrittsdatum)
    .SelectMany(p => p.mitgliedschafts)
    .OrderByDescending(stamm => stamm.stammverien)
    .ThenBy(stamm => stamm.eintritt.eintrittsdatum)
    .Select(stamm => new { ... })
    .ToList();

В любом случае, надеюсь, это даст вам несколько идей о том, что можно попробовать, если у вас есть сопоставленные свойства навигации или вы можете их настроить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...