2017-12-28 31 views
0

私はデータベースコンテキストのクラスでDbSetを宣言しようとしています。 私はどのクラス(Entity Framwork Class)ユーザも呼び出していないためです。 そのため、DbSetを動的に宣言したいのです。DbSet <dynamic>の宣言方法は?

+0

何を試しましたか?あなたの特定のユースケースは何ですか?私はコンテキスト内ですべてを明示的に定義しておき、異なるレベルで動的な処理を行う方がよいと思います。 – kettch

答えて

0

私はあなたの文脈で明示的に定義されたすべてを持っているようにしようとします。そのプロパティ宣言には多くの機能が組み込まれていますが、そのうちの最小のものが型を持つことによる設計時のメリットです。

ダイナミッククエリには多くの手法がありますが、過去に使用したものをルックアップテーブルを動的にクエリするために投稿します。ここ

public List<LookupItemDTO> LoadItems(int lookupId) 
{ 
    //nothing special here, just map the lookup id to a name 
    var lookupRepo = new LookupRepository<LookupDefinition>(uow); 
    var lookup = lookupRepo.Find(id); 

    //map the lookup's name from the table to a type. This is important DO NOT ACCEPT A TABLE NAME FROM THE USER. 
    var targetType = Type.GetType("MyApp.DomainClasses.Lookup." + lookup.Name + ",MyApp.DomainClasses"); 
    // this is an optional extra step but it allows us to instantiate an instance of our repository to ensure that business rules are enforced 
    var lookupType = typeof(LookupRepository<>).MakeGenericType(targetType); 
    dynamic LookupTable = Activator.CreateInstance(lookupType); 
    //just some pattern nonsense to wire up the unit of work 
    LookupTable.SetupUOW(uow); 

    //make sure to cast it into something you can work with ASAP 
    var data = ((IQueryable<LookupTableBase>)LookupTable.All).OrderByDescending(l => l.IsVisible).ThenBy(l => l.SortOrder); 

    var list = from li in data 
       select new LookupItemDTO 
       { 
        Id = li.Id, 
        Description = li.Description, 
        Display = li.Display, 
        SortOrder = li.SortOrder, 
        IsVisible = li.IsVisible 
       }; 

    return list.ToList(); 
} 

キーを使用すると、が動的にテーブルを照会することができるということですが、それはより高いレベルでそれを行う方が良いでしょう。また、あなたとあなたのユーザーの入力との間に何らかの間接的な関係があります。リストからテーブルを選択させ、そのテーブルのIDを使用して名前を検索します。ここで私の解決策は、ルックアップテーブル定義テーブルを持っていることです。すべての動的クエリはそこから開始します最初にとし、その定義テーブルの値を使用して必要な型を構築します。