私はこのようにGridViewにLinqToSql-DataSourceを使用しています:
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」の列が降順であり、テーブル「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());
しかし、これには何の効果もありません!私はこの種のデータソースとLinqに非常に慣れていません。
誰かが私がこの注文を達成するのを手伝ってもらえますか?
グループ化された結果内のアイテムは、その順序を保持しません。順序をどのように考慮したいかに応じて、group byの後、前、および/または後に行う必要がありますFirst
...
これを実現するには、SQLをLinq QL(結合など)に置き換えるよりも、EFの関係をナビゲーションプロパティにマップする方が簡単です。
次の基本クエリを使用します。
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が何であるか、そしてそれがあなたの実体モデルにどのように関連しているかを推測することしかできません。
最初のクエリは、グループ化する基本エンティティのみを取得し、関連するエンティティごとにグループ化します。そのグループ化の結果は、キーがPersonであるグループ化されたmitgliedschaftのセットになります。最新のmitgliedschaftsを持つ人によってこれらのグループを注文するにはMax
、降順の要求が指定されたコレクションの値を使用して、キーに関連付けられた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句の2番目のセットは、選択したグループまたはmitgliedschaftsに適用されます。
目的のビューモデルを作成するには、を挿入して、のSelect()
前のmitgliedschaftsからビューモデルを作成しますToList()
。
ナビゲーションプロパティを使用すると、これはおそらくgroupbyに頼ることなく実行できます。思い切って、このようなものは似たようなものを返すはずです:
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();
とにかく、うまくいけば、ナビゲーションプロパティがマップされているか、それらを設定できる場合に試すべきことについていくつかのアイデアが得られます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加