2012-03-21 7 views
1

System.Linq.Dynamicでオブジェクトを動的にクエリします。動的LINQをエンティティ複合型と互換性を持たせることはできますか?

var selectData = (from i in data 
         select i).AsQueryable().Where("Name = @0","Bob1");//This works fine with a non-entity object 

I knowマップされたエンティティには投影できません。私はこのコードが

 foreach (var item in rawQuery.ObsDataResultList) 
     { 
      var propertyData = (from i in item 
           select i).AsQueryable().Where("PropertyName = @0", "blah"); 
     }//item is a Entity Complex Type 

エラー

が ソースタイプ「ClassLibrary1.Model.bhcs_ObsData_2_Result」のクエリパターンの実装を見つけることができませんでした失敗した理由であると信じています。 「選択」は ではありません。

実行時にPropertyNameを指定する必要があるという事実を考えれば、匿名型またはDTOでプロジェクトする方法はありません。

この時点でEntityの機能を保持する必要はありません。データが必要です。クエリ可能なものにデータをコピーすることは有効な解決策です。したがって、動的LINQでエンティティフレームワークを照会することは可能ですか?ここ

とは、(アイテムオブジェクト通称I照会しようとしているもの、)エンティティクラスのヘッダーです

[EdmComplexTypeAttribute(NamespaceName="MyDbModel", Name="blah_myQuery_2_Result")] 
[DataContractAttribute(IsReference=true)] 
[Serializable()] 
public partial class blah_myQuery_2_Result : ComplexObject 
{ 
+0

私は動的linqについてまだ多くのことを学んでいないので、私はこれに興味を持っています。しかし、私は、(特に主観的には、主観的には)質問式の理解とメソッド呼び出しを同じ式で混在させるのは混乱していると言わなければなりません。 .AsQueryable()から 'data.AsQueryable()'に変更すると、コードをもっと整備しやすくなると思います。 – phoog

答えて

2

まず、System.Linq.Dynamicが完全なMicrosoft製品ではないことを明確にします。しばらく前にリリースしたサンプルであり、異なるLINQ実装が完全にテストされているわけではありません。 EF ObjectContext API用に完全にサポートされているテキストベースのクエリ言語を探している場合は、代わりにEntity SQLを調べる必要があります。

それ以外に、System.Linq.Dynamicを使用したいと思っていて、アプリケーションが動作しないようにする何もヒットしないと自分でテストしても大丈夫です。 。コードスニペットのすべてを理解しているかどうかわからないので、追加情報が必要になります。

最初に、私はあなたの最初の例で「データ」とはどこから来たのかを理解したいと思います。あなたの2番目のスニペットでは、 "rawQuery"とは何ですか?そしてそれはどこから来ましたか? Besdies、rawQuery.DataResultListとは何か、rawQuery.ObsDataResultListとは何ですか?

また、2番目のスニペットについては、実際にはクエリタイプではないオブジェクトの上にあるクエリ演算子を使用して作成しようとしているようです(ただし、 AsQueryableを呼び出すと、コンパイラはbhcs_ObsData_2_ResultがIEnumerableでも非ジェネリックなIEnumerableでもないという前に不平を言っていたはずです。

あなたの回答は、ObjectResultを試してみて、それが役に立ったと言われています。 ObjectResultはクエリオブジェクトではないため、サーバーに送信するクエリを作成することはできません。つまり、ObjectResultに適用するクエリ演算子はすべてメモリ内で評価されます。このことを覚えていないと、フィルタリングを適用する前に、そのテーブルのすべてのデータをメモリに格納する可能性があります。

+0

'data'はモックオブジェクトクエリを表します。 'rawQuery'はカスタムクラスのオブジェクトインスタンスです。クラスには 'List '( 'DataResultList'、' ObsDataResultList')型のメンバーが4つあります。それはDLの読み取り操作から来たものです。 DLは、いくつかのパラメータに基づいて一連のストアドプロシージャを照会します。 paramsはサンプルコードの前にフィルタリングを実行します。だから、私は、メモリ内のテーブル全体をロードすることを心配していません。しかし、それは一般的に考慮すべき点です。 –

0

クエリObjectResult<blah_myQuery_2_Result>代わりに、直接の項目blah_myQuery_2_Result。たとえば、

var result = (from i in rawQuery.DataResultList 
          select i).AsQueryable().Where("CreatedDTM > @0", DateTime.Now.Subtract(new TimeSpan(30, 0, 0, 0))); 
関連する問題