LinqToSql OrderBy 无效

LinqToSql OrderBy has no Effect

我以这种方式将 LinqToSql-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());
            }

现在我要订购选品。首先,Table "mitgliedschaft" 的 "stammVerein" 列降序 AND Table "mitgliedschaft" 的 "eintritt" 列。我尝试了几种方法:

                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很陌生。

谁能帮我完成这个订单?

分组结果中的项目将不会保留其顺序。根据您要考虑的排序方式,您需要在 First...

之后的 and/or 之后以及 and/or 之前执行此操作

要实现此目的,最简单的方法是将 EF 中的关系映射到导航属性,而不是将 SQL 替换为 Linq QL(连接等)

使用以下基本查询:

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

例如,在分组依据之后,您将拥有按人员分组的记录集。如果你想要最早相关记录的第一个人:

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

这是对您的模式和实体关系的粗略猜测,但希望它能帮助您找到合适的东西。我只能猜测 eintritt 是什么以及它与实体模型的关系。

初始查询仅采用您要分组的基本实体,并按相关实体对它们进行分组。该分组的结果将是一组 Grouped mitgliedschafts,其中一个键是 Person。要按具有最新 mitgliedschafts 的人对这些组进行排序,我们在 Key 的关联 mitgliedschafts 上使用 orderby,在给定降序请求的情况下使用集合的 Max 值。

然后 First 给了我们第一个 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();

第二组 OrderBy 子句适用于所选组或 mitgliedschafts。

要组成所需的视图模型,请在 ToList() 之前插入一个 Select() 以从 mitgliedschafts 构建视图模型。

有了导航属性,这或许可以在不借助分组依据的情况下完成。凭直觉,像这样的东西应该 return 类似的东西:

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();

无论如何,如果您映射了导航属性或可以设置这些属性,希望这能为您提供一些尝试尝试的想法。