2012-01-23 6 views
2

を取得:Entity Frameworkの、タイプとLINQのパー表 - 私は製品と呼ばれる抽象タイプがあり、以下のように、型階層のファッションあたりのテーブルに製品から継承する5「タイプ」「タイプ」

Table Per Type

MVC Webページで使用するために新しいクラスにプロジェクトを継承するさまざまなオブジェクトのプロパティを含む、すべてのプロダクトのすべての情報を取得したいとします。私のLINQクエリ以下の通りです:私が持っている問題は、p.pTFi_fixedRateにアクセスしている

 //Return the required products 
    var model = from p in Product.Products 
       where p.archive == false && ((Prod_ID == 0) || (p.ID == Prod_ID)) 
       select new SearchViewModel 
        { 
         ID = p.ID, 
         lend_name = p.Lender.lend_name, 
         pDes_rate = p.pDes_rate, 
         pDes_details = p.pDes_details, 
         pDes_totTerm = p.pDes_totTerm, 
         pDes_APR = p.pDes_APR, 
         pDes_revDesc = p.pDes_revDesc, 
         pMax_desc = p.pMax_desc, 
         dDipNeeded = p.dDipNeeded, 
         dAppNeeded = p.dAppNeeded,  

         CalcFields = new DAL.SearchCalcFields 
         { 
          pDes_type = p.pDes_type, 
          pDes_rate = p.pDes_rate, 
          pTFi_fixedRate = p.pTFi_fixedRate 
         } 
        } 

それは固定のスーパータイプであるとして、これは実体のProductsコレクションに返されません。 LinqとEntity Frameworkを使用して、プロダクト(固定)プロパティの「スーパー」タイプを返すにはどうすればよいですか。私は実際に計算に使用するために、すべての異なるスーパータイプ(ディスク、トラックなど)からいくつかのフィールドを返す必要があります。返される "Product"のタイプをチェックする別々のLinqクエリとしてこれらを返すべきですか?

+0

将来的に誰かがこれを参照すると、以下のようなUnionが動作します。 Linq to Entitiesは複雑なクエリを返す場合、Linqは表現ツリーをナビゲートしてSQLを実際に構築するために永遠にかかるでしょう。私の場合、SQLの実行には1秒(500行)、Linqには3秒がかかりました。私がこれを解決したのは、このリターンのためにTPTを捨てて、ちょうどビューを使用したことでした。 – MagicalArmchair

答えて

1

これは本当に良い質問です。私はJulie Lermanの本を見て、インターネットの周りを偵察しました。私はエレガントな答えを見ることができません。

私がデータ転送オブジェクトを作成する場合は、型のすべてのプロパティが作成され、各型ごとに個別のクエリが作成され、それらがすべて結合されます。私は、プロパティがそのタイプに関連していないDTOのプロパティに空白を挿入します。それでは、EFエンジンがまともなSQLを作成するのに妥当なスタブを作ってくれることを願っています。

var results = (from p in context.Products.OfType<Disc> 
     select new ProductDTO {basefield1 = p.val1, discField=p.val2, fixedField=""}) 
     .Union(
     from p in context.Products.OfType<Fixed> 
     select new ProductDTO {basefield1 = p.val1, discField="", fixedField=p.val2}); 

しかし、それが最良の答えは、それが可能にすることはできません。他に何かありますか?

+0

Hello Crab Bucket、もう一度入力していただきありがとうございます。私はエンティティフレームワークで最高のものを得るためにレスリングしています。私はユニオンの拡張メソッドを使用することを考慮しなかった、私はそれに亀裂を与え、パフォーマンスがどのようなものか見てみましょう。そうでない場合は、パフォーマンスが悪い場合は、@ CodeWarriorsの提案に従って、SPまたはスケーラ値関数を使用してこのデータを計算しようとします。例もありがとう、彼らは本当に助けます。 – MagicalArmchair

+0

@MagicalArmchair。問題はありません - 私たちの多くはそれを使って作業していると思います。 TBH - Julie Lermanの本でTPT継承セクションをもう一度読んだだけですが、TPTは使い易いかどうか疑問に思っています。あなたの質問は良い例で、基底型がすでにレコードを持っている場合は、継承型にレコードを挿入することも問題です。それは容易に見えません。これで継承コーナーにロックされているように見えるかのように見えます。もちろんMHOだけです。幸運はありますが –

+0

実際のEDMセットアップは非常に簡単で理想主義的な観点からは実際にはADO.net、Tableadapters、Datasetsのコントロールを求めていますが、実際にはかなり意味があります。これはおそらく、EFでうまくいくものにまだ慣れていないことから生まれたでしょう。私は組合のアプローチを試して、それは仕事をする、私は3つのLinqクエリは、デイジーチェーン連合と一緒に必要でした。実行すると、5つの異なるテーブルからDBから35のフィールドの20行を戻すために、エンティティフレームワークは370行以上のSQLを書きました!!おそらくもっと重要なのは、最初の実行では3秒かかります – MagicalArmchair

1

固定は製品から継承されていますか?その場合は、おそらくFixedの代わりにクエリを実行していて、Productプロパティがそのプロパティにプルされるはずです。

計算をしていくつかの合計や何かを取得しているだけの場合は、ストアドプロシージャを使用して調べることができます。データベースの呼び出し回数が減り、実行速度が大幅に向上します。

+0

応答@CodeWarriorをありがとう。修正済み、その他の4種類の「スーパー」タイプは、Productから継承されています。計算はビジネスロジックの視点からはかなり複雑なので、SQLスケーラ関数やSPではなくC#メソッドでそのコードを保持しようとしています。私は5つの異なるLinqクエリで5種類のそれぞれを照会し、それらをまとめてデータを返すことができますか?次に、マテリアライゼーションで計算を行いますか?それとも厄介なことですか?これはIQueryableを返すので、実行を最後まで延期しようとしています(たとえば、MVCサイトでページングが発生したときなど)。 – MagicalArmchair

+0

HPTクラスがたくさんある場合、私は絶対にそうしなければならない場合、リストコレクションにすべてそれらを照会します。その後、TypeOf – CodeWarrior

+0

Thanks CodeWarriorを調べて評価することで、何でも実行できましたが、ToList <>は貪欲な演算子であるため、これらを具体化しないようにしたいと考えています。私は助けることはできませんが、できる限りデータに近いあなたの選択は、SPやDB機能* sigh *の中で正しいと思っています。拡張メソッドを使ってUnionを作成する@Crab Bucketsソリューションをまず試してみましょう。私はユニオンが怠惰な方法だと推測しているので、そのトリックを行うかもしれません... – MagicalArmchair

0

は、まあ、それはあなたのモデルによって異なりますが、通常はあなたのような何かをする必要があります:SomeNavPropertypTFi_fixedRateをロードするエンティティタイプがある

var model = from p in Product.Products.Include("SomeNavProperty") 
.... (rest of query) 

+0

入力をありがとう@kprobst!これは、Entity Frameworkでは継承ではなく、継承が存在する場合にのみ機能します。したがって、Lenderからのデータを含めるには、これを行うことができましたが、Productを継承するオブジェクトにはProductのナビゲーションプロパティがありません。 – MagicalArmchair

+0

ああ、あなたが今言っていることが分かります。 nvm :) – kprobst

関連する問題