2010-12-10 19 views
1

LinQステートメントからエンティティオブジェクトを作成したいが、その列をすべてロードしたくない。Entity Framework - LinQ投影の問題

ORDERSオブジェクトには多くの列がありますが、REFERENCEおよびOPERATION列を取得して、SQL文と結果が小さくなるようにしたいだけです。

これのLINQ文は正常に動作し、負荷のすべての私のオブジェクト属性:スローされたエラーが

var orders = (from order in context.ORDERS 
       select new ORDERS 
       { 
        REFERENCE = order.REFERENCE, 
        OPERATION = order.OPERATION 
       }); 

ある

次の文は失敗したが

var orders = (from order in context.ORDERS 
      select order); 

は私のオブジェクトの2つのプロパティのみをロードするために:

The entity or complex type 'ModelContextName.ORDERS' cannot be constructed in a LINQ to Entities query.

何が問題ですか?このようにオブジェクトを部分的にロードすることは可能ではありませんか?

ご回答いただきありがとうございます。


私はあなたの答えの両方を使用して、今私が持っているので、私はあなたにYakimychとディーンの両方に感謝しなければならないANSWER [OK]を

var orders = (from order in context.ORDERS 
       select new 
       { 
        REFERENCE = order.REFERENCE, 
        OPERATION = order.OPERATION, 
       }) 
       .AsEnumerable() 
       .Select(o => 
         (ORDERS)new ORDERS 
         { 
          REFERENCE = o.REFERENCE, 
          OPERATION = o.OPERATION 
         } 
     ).ToList().AsQueryable(); 

そして、私は私が望む正確に何を取得し、 SQLステートメントは完璧ではありませんが、私は必要な2つの列だけを返します(そして、すべての行 "1"に含まれる別の列を返しますが、私はなぜか分かりません) - 私はこのメソッドでサブオブジェクトを構築しようとしました。それはうまくいく。

答えて

2

いいえ、マップされたオブジェクトには投影できません。私は、問題は、クエリ自体の中に新しいエンティティを作成していると思うので、どのようにしようとしてについては、この

var orders = (from order in context.ORDERS 
       select new 
       { 
        REFERENCE = order.REFERENCE, 
        OPERATION = order.OPERATION 
       }); 
+0

OK、これを既に試しましたが、次にこの匿名オブジェクトをエンティティタイプにキャストできますか? – mbp

+2

これをエンティティにマップすることはできません。このためにカスタムオブジェクト(DTO)を作成することはできますが、エンティティを部分的に読み込むことはできません。エンティティを変更して安全にしようとすると、EFはその処理方法を知らないためです。 – Steven

0

context.ORDERS.ToList().Select(o => new ORDERS 
{ 
    REFERENCE = o.REFERENCE, 
    OPERATION = o.OPERATION 
}); 
+0

これはSQLクエリの問題を解決しません。オブジェクト全体を取得し、すべてのフィールドからデータを取得する場合と同じになります。これが実行された後、結果をメモリに変換します。しかし、それ以降はそれを行うことは実際にはありません。 – Yakimych

+0

ここにソースコードを投稿できないので、私の最初の投稿を確認してください。 – mbp

2

上記の溶液に問題がからということであるあなたは、代わりに匿名型を使用することができますAsEnumerable()を呼び出すと、クエリはデータベース上で実行されます。ほとんどの場合、大丈夫です。しかし、いくつかの大きなデータベースで作業する場合、テーブル全体(またはビュー)を取得することは、おそらくあなたが望むものではありません。我々はAsEnumerableを削除するのであれば、我々は次のエラーで戻っ正方形の1にしている:私はここに一日のために、この問題に苦しんでされている

The entity or complex type 'ModelContextName.ORDERS' cannot be constructed in a LINQ to Entities query.

私が見つけたものです。私は自分のエンティティクラスから継承した空のクラスを作成し、このクラスを使用して投影を実行しました。 (共分散機能を使用して)

public sealed class ProjectedORDERS : ORDERS {} 

投影クエリ:

IQueryable<ORDERS> orders = (from order in context.ORDERS 
       select new ProjectedORDERS 
       { 
        REFERENCE = order.REFERENCE, 
        OPERATION = order.OPERATION, 
       }); 

ほら!エンティティにマップされ、必要なときにのみ実行される、予測されたクエリがあります。

+0

+1私もこの問題で多くの時間を費やしています。失敗した数千回の試行の後、あなたと同じ解決策になりました。エンティティから継承している空のクラス。それでも、EFがエンティティクラスへの投影を許可しない理由を知りたいのですが、これは非常に便利なことです。 –

関連する問題