、拡張メソッドSelect()
とOrderBy()
両方がとして定義されるObjectQuery
、戻り:Select()
の戻り型がIQueryable<T>
でありOrderBy
のがIOrderedQueryable<T>
あるObjectQueryは本当にIOrderedQueryableですか。エンティティ・フレームワークに適用
public class ObjectQuery<T> : ObjectQuery, IOrderedQueryable<T>,
IQueryable<T>, <... more interfaces>
を。つまり、両方とも同じ型を返しますが、別のラッパーで返すと言うことができます。幸いなことに、の後にThenBy
を適用できるようになりました。
今、私の問題です。
var query = context.Plots.Where(p => p.TrialId == 21);
これは私ObjectQuery<Plot>
あるIQueryable<Plot>
を与える:
さんが言ってみましょう私は、これは持っています。しかし、それはまたIOrderedQueryableです:
var b = query is IOrderedQueryable<Plot>; // True!
しかし、それでもまだ:
var query2 = query.ThenBy(p => p.Number); // Does not compile.
// 'IQueryable<Plot>' does not contain a definition for 'ThenBy'
// and no extension method 'ThenBy' ....
私が行うと:
var query2 = ((IOrderedQueryable<Plot>)query).ThenBy(p => p.Number);
それはコンパイルが、実行時例外を与える:
タイプ '
IQueryable`1[Plot]
'の式は使用できません。またはパラメータIOrderedQueryable`1[Plot] ThenBy[Plot,Nullable`1](IOrderedQueryable`1[Plot], Expressions.Expression`1[System.Func`2[Plot,System.Nullable`1[System.Int32]]])
「メソッドの」タイプ'IOrderedQueryable`1[Plot]
の「
キャストが(私がチェック)が行われるが、ThenBy
のパラメータは、まだ(私は少し困惑)のIQueryableとして見られています。
ここで、ObjectQuery<Plot>
がIQueryable<Plot>
(Select()
など)として返されるとします。返されたオブジェクトのThenBy
に安全に呼び出すことができるかどうかを知りたければどうなりますか? ObjectQuery
が「本当」か「偽」IOrderedQueryable
の場合は、例外を捕まえずにどのように把握できますか?
具体的な型をチェックすることをお勧めします。これは、クエリープロバイダにあなたを結びつけるもので、正確には 'IQueryable'が避けているものです。 1つのアプローチは、 'SortBy()'メソッドを調べるための式を素早く歩くことですが、誰かが何か簡単なことを指摘するだろうと思います。そうでない場合は、ここにコメントし、私はあなたに木を歩くためのコードを提供します。幸運 – Smudge202
@ Smudge202ありがとうございました。表現木より歩くのがずっと楽しい場所がたくさんありますが、あなたが抵抗できなければ...しかし、はい、おそらく他の人。 –
@ Smudge202 btw、両方のインタフェースを実装しているため、具体的な型をチェックするのは、とにかく動作しません。それは私が本当に知る必要がある場合、あなたが示唆するように、おそらく深い検査は唯一の方法であるので、ここでは通常の反射が役に立たないと私を困惑させる。 –