2

私は最近Entity Framework 5を学んでいます.MVVMとPRISMに基づいたWPFアプリケーションを開発しています。プロパティが変更された通知を取得するためにObservableCollection、データを保持するために使用しています。

エンティティ プロジェクションに linq を使用すると問題が発生し、最適な解決策がわかりません。

ご存知のように、linq を介してエンティティへの射影を実行すると、メソッドのスコープを誰も知らない匿名型が取得されます。このクエリを強く型付けする方法を検索しました。

この問題に関するいくつかの議論を見ましたが、最善のアプローチを見つけることができませんでした。

私は3つの異なる解決策を見ました:

  1. QueryView の使用
  2. 定義クエリの使用
  3. http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/c6b8375a-2684-4020-bbcc-24433baf997b

3番は最も単純なもので、私が必要としているものとまったく同じように見えますが、リフレクションは「高コスト」の操作であることを知っているので、この問題に対する最善のアプローチは何かという質問に戻りますか? 他の解決策はありますか?

4

2 に答える 2

0

匿名型ではなく、名前付き型に射影する必要があります。

var query = from c in Customers 
            join o in Orders on c.CustomerID equals o.CustomerID
            select new OrderDto {
                                    customer_name = c.CompanyName,
                                    order_date = o.OrderDate,
                                    order_Id = o.OrderID
                                };

シンプルなクラスを使用しOrderDtoます。だから、それはあなたの選択肢ではありません。

補足: おそらくナビゲーション プロパティを使用できます。

var query = from o in Orders
            select new OrderDto {
                                    customer_name = o.Customer.CompanyName,
                                    order_date = o.OrderDate,
                                    order_Id = o.OrderID
                                };

参加方法は EF が考えます。

于 2013-03-12T11:36:50.517 に答える
0

これは私が使用するものです:

私はVBを使用しています:

Dim ObjectQuery As IQueryable(Of YourObject) = CType((From c In YourContext.objects Select c), IQueryable(Of YourObject))
Return New ObservableCollection(Of YourObject)(ObjectQuery)

CType を使用しない C# のクライアント テーブルに基づく上記の単純なバージョン。vb から C# へのコンバーターを使用したため、調整が必要になる場合があります

IQueryable<client> ClientQuery = from c in ftcContext.clients select c;
return new ObservableCollection<client>(ClientQuery);
于 2013-03-12T05:40:42.583 に答える