2011-01-25 12 views
3

私はLinqをクエリに使用していますが、リフレクションを使用して「選択」部分に返すプロパティのリストを取得したいと考えています。私は無用に以下を試しました:リフレクトを使用してlinqクエリで選択フィールドを取得する

string[] paramList = new[]{"AppId","Name"}; 
var query = 
       from entity in 
        _ctx.App 
       select new {entity.GetType().GetProperties().Where(prop=>paramList.Contains(prop.Name))}; 

私はここで何が欠けていますか?

答えて

1

私は、あなたが望んでいることを自分のやり方で達成できるとは思っていません。匿名型を作成するには、コンパイル時に型の形状(つまりプロパティ)を知っていなければなりません。あなたが望むことをするための最良の方法は、選択式を手動で作成し(System.Linq.Expressionsにある式APIを使用して)、コードで組み込んだ式をSelect()拡張メソッドに渡します(宣言的クエリを使用しません)あなたの例のような構文)。

最終的には、この作業を行うと、リフレクションを使用して、実行時まで保持する内容が分からないために取得するコレクションの項目から何かにアクセスする必要があります。

オブジェクト全体を返す必要がない理由はありますか?

+0

実際にはあなたが正しいです、選択は結果セットの投影だけですか?クエリーのパフォーマンス(返されるデータの量)に関しては関係ありません。私はselect句をフィルタリングして、特定のプロパティでしか動作しないようにするために、クエリから戻ってくるものを制限しようとしていました。 – Cranialsurge

+0

プロジェクションがデータベースクエリに影響を与えるかどうかは、Linqプロバイダに完全に依存します。私はEntity Framework(そしてNHibernate Linqの少なくとも1つの実装)がselect文を考慮に入れ、必要なものだけを取り戻すようにSQL文を作成しようとしていることを知っています。しかし、あなたが猥褻な量のデータについて話していない限り、私はまだそのレベルに最適化することについて心配しないでしょう。 –

2

EFクエリ内でリフレクションを使用する場合は、自分で式を記述する必要があります。問題は、LINQの自体ではなく、あなたのクエリが式ツリーEntity Frameworkのdoesnのに解析されているため、より多くの情報

ため、これらの既存の質問を見てください理解していない。

関連する問題