IQueryableを返す関数で2つのテーブル結合があるとしますが、その出力は2つのどちらでもない名前付きの型ですテーブル:フィールドが選択された出力にないときにWhere()をIQueryableに追加できますか
var qry = from p in Persons
join h in Hobbies on p.PersonId equals h.PersonId
select new OutputType
{
Name = p.FirstName,
Hobby = h.HobbyName
}
return qry
のは、今私はこれが返されたクエリを取るなど何かやってみたかったとしましょう:あなたはのIQueryableがタイプOUTPUTTYPEであるため、これは問題ですので、私ができる見ることができるように
var newQuery = qry.Where(p=>p.Age > 18)
をAgeTypeをOutputTypeに追加しない限り、人の年齢にどこに追加してください。
IQueryable式ツリーに「侵入」してラムダを追加して、そこに指定されたソースコレクションをクエリし、Where句を追加しますか?または、最終的に投影することに無関心であっても、WhereフィールドをOutputTypeに追加する必要がありますか?
私はあなたが本当にしたい場合、これを行うための方法を見つけることができ疑いますが、本当にそれはあなたのデザインが欠陥があるだけの兆候だ、とあなたはあなたが前にフィルタリングをやっているようにあなたのコードを構築する必要がありますシーケンスを投影する。 – Servy
少し改造して、 'Persons'の値を渡すこともできます。ですから、 'Persons'の代わりに' Persons.Where(p => p.Age> 18) ' –
に渡します。私が与えた例はちょうどその例でした。私はちょうど概念ではなく、使用法を示していた。実際のケースは、既存の従来のOracleデータベースの上に4テーブル・ジョインです。同じ(大)クエリの3つの異なるバリエーションがあり、異なるテーブルの非投影値のWhere句のみが異なります。私は複数の大規模なLINQクエリを維持していないので、コードの冗長性を減らそうとしています。以下の最初の答えは、私がフィールドを早期に追加し、最終的にそれを投影しないためにペナルティを課せられないという点で非常に役立ちます。唯一のネガティブは、複数の新しいタイプを作ることです。 –