【问题标题】:LinqToSql OrderBy has no EffectLinq To Sql Order By 无效
【发布时间】:2020-05-21 06:21:44
【问题描述】:

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

现在我想订购选择。首先,表“mitgliedschaft”的“stammVerein”列下降和表“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 很陌生。

谁能帮我完成这个订单?

【问题讨论】:

  • 你能显示输出吗?
  • 检查它是否回答了您的问题stackoverflow.com/questions/5344805/…
  • 对不起,我无法显示输出。但它总是一样的。我已经尝试过与链接帖子相同的方式。
  • 什么版本的 EF - EF Core 2.2、EF Core 3、EF 6?您所有的尝试都以 GroupBy 结尾 - 这可能是导致问题的原因。

标签: sql asp.net entity-framework linq gridview


【解决方案1】:

分组结果中的项目不会保留其顺序。根据您希望如何考虑排序,您需要在 group by 之后、之前和/或之后进行操作 First...

要做到这一点,如果您将 EF 中的关系映射到导航属性,而不是用 Linq QL(连接等)替换 SQL,这将是最简单的方法

使用以下基本查询:

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

例如,在 group by 之后,您将拥有按 Person 分组的记录集。如果您想要第一个具有最早相关记录的人:

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

这是对您的架构和实体关系的疯狂猜测,但希望它会帮助您找出适合的东西。我只能猜测 eintritt 是什么以及它与您的实体模型的关系。

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

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

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

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

使用导航属性,这可能无需借助 group by 即可完成。直觉上,这样的事情应该会返回类似的东西:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 2010-12-31
    相关资源
    最近更新 更多