2

ラムダ式を使用したクエリがあり、親テーブルの子コレクションであるテーブルの列から並べ替えできるようにしたいと考えています。クエリは次のようになります。

 var query = ctx.Timelines.Include("Rule.DocumentRules").Where(...).OrderBy(o => o.Rule.DocumentRules.OrderBy(t => t.SortOrder));

SortOrder 列は Timelines エンティティの 3 レベル下にあり、どの拡張機能を使用してアクセスすればよいかわかりません。上記のコードを使用すると、「DbSortClause 式には順序が比較可能な型が必要です。パラメータ名: キー」というエラーが表示されます。2 番目の OrderBy の代わりに Select 拡張機能を使用すると、同じエラーが発生します。この列で並べ替える方法を知っている人はいますか? この「SortOrder」列は、主キーまたは外部キーではありません。

ありがとう

4

3 に答える 3

1

これは古いスレッドであることは知っていますが、同じ問題を抱えていたときにこの投稿に出くわしました.

実際の親 (つまり、お母さん/お父さん) とその子供を表示する必要があるが、レポートに子供の名前をアルファベット順に表示したいとします。それらが正しい順序でデータベースにない場合は、要件に基づいて表示するために、子テーブルの「名前」フィールドで並べ替える必要があります。

期待どおりに動作する単純な T-SQL の例:

select * from ParentTable p
inner join ChildTable c on c.ParentId = p.ParentId
where p.ParentId = 1
order by c.Name

元のポスターと同じ方法でこれを達成しようとしましたが(以下に示します)、「DbSortClause 式には、順序に匹敵する型が必要です」という例外が発生しました。

.OrderBy(x => x.ParentTable.ChildTable.OrderBy(y => y.Name))

私はプロジェクションを使用しているため、これはすべての場合に機能するとは限りませんが、子リストのプロジェクション内で OrderBy を実行すると、希望どおりに機能することがわかりました。

Children = x.ParentTable.ChildTable.OrderBy(y => y.Name).Select(aa => new ChildTableModel

これを達成するためのより良い/別の方法があるかもしれませんが、これは私が望んでいたことだったので、共有したいと思いました.

于 2015-02-17T15:50:16.283 に答える
0

関連するエンティティの列で並べ替えようとしたときに、同じ問題が発生しました。うまく機能する唯一の解決策は、エンティティSQLを使用することでした。ObjectQueryを返すESQLクエリを使用する簡単な例を次に示します。ESQLからLINQ、エンティティへの変換。関連するエンティティで並べ替えます。

うまくいけば、これが役立つでしょう。

于 2012-05-30T21:07:15.910 に答える
0

複数の子項目で並べ替えようとしているようですが、コンパイラにとっては意味がありません。これら 2 つのエンティティ間に実際に 1 対 1 の関係がある場合は、次のようなものを試すことができます

var query = ctx.Timelines.Include("Rule.DocumentRules").Where(...).OrderBy(o => o.Rule.DocumentRules.First().SortOrder));

データベースの設定方法によっては、null 例外が発生する可能性があります。

于 2012-05-30T20:51:00.537 に答える