2017-07-11 11 views
0

をトラバースすることにより、外国キーデータに到達する必要が2017年より良い方法 - Visual StudioでC#6およびEF 6を使用してデータ構造

私は単に外国とのテーブル(SQL Serverなど)のセットアップを持っていますitem_typeのようなものをitem_type_description にルックアップするためのキー制約。私はそうのような主要なデータを取得した場合、私はすぐにデータテーブルにすべてをダンプすることができ (私はすべてのフィールドをしたいと仮定します):

var dataPull = (from dp in aDb.TNG_RMA_items 
         select 
         dp).ToArray(); 

     collected_scan_dataGrid.DataSource = dataPull; 

しかし、すぐに、私は別のものに取得するデータ構造を横断する必要があるとして、テーブルのような: dp.item_types.short_description

私は、その後のような何かしなければならない:今

var dataPull = (from dp in aDb.TNG_RMA_items 
         select 
         new 
         { 
         dp.item_number, 
         dp.RMA_as_scanned, 
         dp.item_types.short_description 
         }).ToArray(); 

     collected_scan_dataGrid.DataSource = dataPull; 

を、これはフィールドの数が少ないの罰金ですが、例えば、このテーブルには、約30のを持っていますそれらと私はそれらを必要とするすべて - サブセットではありません。

どのようなオプションがありますか?

ジョー

+0

あなたはすべての30人の子の関係が必要な場合は、その後、あなたはすべての30個のプロパティを指定する必要があります。ここにはショートカットはありません。 – DavidG

答えて

0

Entity Framework Loading Related Entitiesを参照してください。

var dataPull = 
    aDb 
    .TNG_RMA_items 
    .Include(dp => dp.item_types) 
    .ToArray(); 
collected_scan_dataGrid.DataSource = dataPull; 
+0

"lamda expressを代理人型ではないため" string "型に変換できません。それはどういう意味ですか? –

+0

これは' Include'呼び出しが 'delegate'型の代わりに' string'パラメータを期待していることを意味します[lambda式]パラメータを参照してください。[Entityフレームワークでラムダ式を含む「インクルード」メソッドが見つかりません」(https://stackoverflow.com/q/11259483/580951) – Romoku

0

これは非常にテストされ、そしておそらく非常に悪い考えがありますが、EFのメタデータを使用することができます。

static class Ext { 
    public static IQueryable<T> IncludeAll<T>(this IQueryable<T> query) { 
     using (var db = GetContext(query)) { 
      var workspace = ((IObjectContextAdapter)db).ObjectContext.MetadataWorkspace; 
      var itemCollection = (ObjectItemCollection)(workspace.GetItemCollection(DataSpace.OSpace)); 
      var entityType = itemCollection.OfType<EntityType>().Single(e => itemCollection.GetClrType(e) == typeof(T)); 

      foreach (var navigationProperty in entityType.NavigationProperties) 
       query = query.Include(navigationProperty.Name); 
     } 

     return query; 
    } 

    private static DataContext GetContext(IQueryable q) { 
     if (!q.GetType().FullName.StartsWith("System.Data.Linq.DataQuery`1")) return null; 
     var field = q.GetType().GetField("context", BindingFlags.NonPublic | BindingFlags.Instance); 
     if (field == null) return null; 
     return field.GetValue(q) as DataContext; 
    } 
} 
+0

Wow。このボックスは、ソリューションに多すぎる複雑さを加えます。つまり、他のプログラマーが私を嫌うかもしれないという意味です。しかし、私は「おそらくは非常に悪い考え」のコメントを愛しています! –

+0

これを研究しているうちに、私は来ました特定のエンティティの拡張機能にすべてのインクルードを追加することをカプセル化した型固有の 'IncludeAll'拡張を実装した人の向こう側にあります。 – NetMage

関連する問題