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();
无论如何,如果您映射了导航属性或可以设置这些属性,希望这能为您提供一些尝试尝试的想法。
我以这种方式将 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
...
要实现此目的,最简单的方法是将 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();
无论如何,如果您映射了导航属性或可以设置这些属性,希望这能为您提供一些尝试尝试的想法。