2

EF4.3 でやりたいことができないのは確かですが、その試みを断念する前に、もっと経験豊富なプログラマーに任せてみようと思いました。

「person」と「org」という 2 つのエンティティ タイプがそれぞれ「named」と呼ばれるルート エンティティから派生するスキーマがあります。この構造により、「named」エンティティが組織であるか企業であるかを区別することなく、「named」のインスタンスを「address」と呼ばれる別のエンティティのインスタンスと多対多の関係「entity_address」を介して関連付けることができます。人。

entity_address を照会するとき、entity_address インスタンスが「個人」か「組織」かに応じて、さまざまなプロパティで結果を並べ替えられるようにしたいと考えています。個人の場合、ソート アルゴリズムへの「入力」はプロパティ「last_name」の値である可能性がありますが、組織の場合はプロパティ「org_name」である可能性があります。

明らかなことを試してみると:

IQueryable<named> sorted = entities.OrderBy(x => ( x is person ) ? ( (person) x ).last_name : ( (org) x ).org_name);

「ソートされた」EFにアクセスすると、プリミティブ型のみをキャストできるという例外がスローされます。「x」インスタンスにキャスト演算子を適用できないと思います。

私はあまり明白ではないアプローチをたくさん試しましたが、成功しませんでした:)。

LINQ to Entities でこれを行う方法はありますか?

データベースを非正規化し、「名前付き」エンティティに「sort_field」を貼り付けて、それをソートすることで問題を解決できることはわかっています(sort_field値をインスタンスの値の変更と一致させるためのロジックを含める必要があります個人と組織の、しかしそれは確かに実現可能です)。

4

2 に答える 2

0

does this work? I'm assuming that entities is a collection of named...

entities.OrderBy(x => x as person == null ? x.org_name : x.last_name)

于 2012-07-18T17:28:47.140 に答える
0

目的を達成する 1 つの方法は、両方のエンティティを同じ (匿名) タイプに射影することです。

entities.OfType<Person>()
    .Select(p => new { p.Prop1, p.Prop2, ..., SortProp = p.last_name })
.Union(
    entities.OfType<Organization>()
        .Select(o => new { o.Prop1, o.Prop2, ..., SortProp = o.org_name }))
.OrderBy(x => x.SortProp)

プロジェクションは、まったく同じプロパティを同じ順序で持つ必要があります。

もちろん、すでに行った方法、つまり on でメモリ内でソートを行うこともできますentities.ToList()。しかし、それは でそれを行う目的を無効にしIQueryableます: データベースに仕事をさせます。

于 2012-07-18T19:16:53.483 に答える