1

開発者とエンド ユーザーの両方が、SQL コードをまったく記述せずに (実行時に選択された) リレーショナル DB からデータを取得できるアプリケーションを作成しようとしています (データベースと対話するときに文字列を連結しないことが望ましい)。このアプリケーションの目的は、式ツリー ビルダーへの GUI と、それによって生成されたツリーの XML シリアル化の 2 つです。

物事をうまく進める方法について、いくつかのガイダンスやヒントをお願いしたいと思います。他の誰かにこれを書いてもらいたくない - これは私のプロジェクトであり、コードを書くのは私です。

だから私の質問は:

  1. 実行時に接続文字列のみを使用するだけで、オブジェクト モデルを作成し、DB の要素をセットでアドレス指定できますか? たとえば、すべてのテーブル、ビュー、関数、および sproc のリストなどです。

  2. 式ツリーを構築できるように、前述のリストの要素を拡張メソッドで使用できますか?

  3. CSDL、SSDL、および MDL ファイルのみを含む (Entity クラスを含まない) データベースからこれらのリストを取得するために、Metadata Workspace クラスと ItemCollections を使用できますか?

  4. 式ツリーの結果をシリアル化するために LINQ to XML を使用できますか? それとも、Entity Framework に固有の他のシリアル化テクノロジを使用する必要がありますか? (ここに示す例のように: http://msdn.microsoft.com/en-us/library/bb738528.aspx )

PS: これまでの私の調査からのいくつかのメモは次のとおりです。 1. たとえば、DataContext.GetTable() メソッド (はい、ジェネリックではなく、弱く型付けされたもの) は、DataContext が接続文字列のみを受け取った場合、データを取得しませんでした。

  1. スキーマ アーティファクトを生成するために EdmGen ツールを呼び出しています。これまでのところ、それらの属性を読みましたが、ラムダ式で使用できる要素のある種のリストを取得しようとしています (テーブルなど)。 ?

  2. 私の理解が正しければ、Entity Framework では、Metadata Workspace や ItemCollections などのクラスを EdmGen ツールと共に使用して、概念スキーマをアプリケーションのオブジェクト モデルとして表すために必要なオブジェクトのセットを作成できます。

ここと MSDN の他の関連トピックに沿って Entity Framework プログラミング ガイドを参照しましたが、これまでのところ、このシナリオに関連する情報は見つかりませんでした。昨日、「Programming Entity Framework」という本を手に入れました。答えのいくつかがそこにあることを願っています。手がかりが見つかったら、この質問を更新します。

そのため、混乱しており、まだ検索中ですが、この件について何か助けていただければ幸いです。

敬具、 ボリスラフ

4

2 に答える 2

1

この問題について彼の考えを投稿してくれたdaveにもう一度感謝します。

これまでの私の研究の要約は次のとおりです。

LINQ to SQLを優先して、LINQ to Entitiesを放棄します。これにより、このプロジェクトをより簡単に行えるようになります。

それで、ここに再び私の質問と私が今まで持っている答えとコメントがあります:

  1. 実行時に接続文字列のみを使用することで、オブジェクトモデルを作成し、セット内のDBの要素(たとえば、すべてのテーブル、ビュー、関数、およびsprocのリスト)をアドレス指定できるようにすることは可能ですか?

@Dave-実際にはこれは一種の可能性があります-LINQPadの公式ウェブサイトの「HowLINQPadWork」セクションを見て、答えは次のとおりです。Reflection.Emitを使用して実行時にクラスを生成し、メソッドのメモリ内フットプリントを作成します。プロパティとその属性を作成し、それらに基づいてクラスを作成します。また、MSDNのモデレーターからこのヒントを入手します:http : //social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/471c8672-0a77-4186-b1d3-844abd8a822b実行時にオブジェクトモデルを取得することが可能です。

  1. 前述のリストの要素を拡張メソッドで使用して、式ツリーを構築できますか?

3.メタデータワークスペースクラスとItemCollectionsを使用して、CSDL、SSDL、およびMDLファイルのみ(エンティティクラスは含まない)のデータベースからこれらのリストを取得できますか?

私はここで正しい質問をしなかったと思います-私が言いたかったのは:実行時に、列Col1、Col2、Col3を持つテーブルテーブルがあることに気づいています。単純なLINQtoSQLアプリでは、コードは次のようになります。

Table.Select(t => t.Col1, t.Col2, Col3)

ただし、私はこれを探しています。ユーザーが選択に参加する列を選択するため、最終的な選択は次のようになります。

foreach(String UsersChosenColumn in TableColumnsArray)
   XDocumentXElement(UsersChosenColumn, (Table.Select(t => t.TableColumnsArray[UsersChosenColumn]))

ただし、列の名前を見つけるだけでは不十分であるため、これを行うことはできません。列のタイプを知ることで、作業を完了できます。私は今これを調べていますが、LINQ to SQLの観点からのみであり、LINQtoEntitiesではありません-ロジックはそこで異なる可能性があります。

@Dave:プロジェクトのシナリオは次のとおりです。ユーザーは次のデータのXMLを取得したいと考えています:Orders.Name、Order.Price、Orders.Products.Name、Orders.Products.Manufacturer Where Orders.OrderID=1234。

出力は次のようになります。

<Order>
 <Name>Some Order Name</OrderName>
 <Price>Some Price</Price>
  <Products>
   <Product>
     <Name>Some Product Name</Name>
     <Manufacturer>Shady Company Inc</Manufacturer>
   </Product>
   <Product>
     <Name>Some Product Name 2</Name>
     <Manufacturer>Another Company (TM)</Manufacturer>
   </Product>
  </Products>
</Order>

この質問にはすでにEFタグを付けているので、EFではなくLINQtoSQLの回答を探しているので閉じます。

このテーマについて他の質問をする場合は、適切なLINQtoSQLタグを添付してみます。

最高です、ボリスラフ。

于 2009-09-06T17:19:05.130 に答える
0

これらの質問は理論に重きを置いており、適用が軽視されているため、何を達成しようとしているのかを理解するのが難しくなっています。あなたの質問から私が理解できることに基づいて、これが私の最良の答えです。要件の詳細を更新していただければ、それらを改善できます。


1: これは、「すべてのデータベース オブジェクトを含める接続文字列を使用して、実行時にエンティティ モデルを自動生成できますか?」のように聞こえます。

いいえ。Entity Model は Entity Data Model (つまりMyModel.edmx.) によって定義されます。これは Object Services クラスを生成するためMyModelEntities. に使用されます。Entity Framework Provider がそれに対してクエリを実行するには、モデルが存在し、利用可能である必要があります。

2: 「式ツリー」がラムダまたは LINQ 構文を意味する場合:

IEnumerable、IQueryable、またはこれらのような他のインターフェイスを実装するコレクション オブジェクトは、LINQ ( from i in EntitySet... select i) または lambda ( .Where(x=>x.Id == 5)) 構文を使用してクエリできます。

3: EDM 定義 (CSDL、SSDL、MDL) を単独で使用して、データベースに直接クエリを実行できますか?

これが LINQ to Entities の機能です。LINQ クエリを SQL クエリに変換します。L2E プロバイダーを再発明する必要があるのはなぜですか?

4: エンティティ オブジェクトのシリアル化は、EF v1 では少し奇妙です (read:broken)。Entity オブジェクトには多くの EF バゲージ (EntityObject から派生し、追加のプロパティを運ぶ) が付属しているため、シリアル化は困難な場合があります。どれだけうまく機能するかは、エンティティ オブジェクトと、それらがシリアル化された後に何をするかによって異なります。

于 2009-08-25T20:19:42.700 に答える