2017-12-31 40 views
2

System.Linq.Dynamic.Coreを使用して、EFのクエリにラムダ式を動的に追加しています。EFコア2.0の動的アクセステーブル

名前でテーブルを選択することもできます。私はこの答えが見つかりました:

https://stackoverflow.com/a/28101268/657477

をしかし、それはasp.netコア2.0で動作しません。私は使用することができませんDbSet私はDbSet<TEntity>を使用する必要がありますそれはエラーメッセージで言う。

は私が行うことができるようにしたいdb.GetTable("Namespace.MyTable").Where(...)

私はこれをどのように行うことができますか?

+0

TEntity is Gener is is it? – Valkyrie

+0

こちらをご覧くださいhttps://stackoverflow.com/a/44143131/2946329 –

答えて

5

まず、名前からエンティティのタイプを取得する必要があります(タイプを持っている場合は、そのまま使用してください)。それに対してリフレクションを使うことができますが、おそらくEFコアの正しい方法はFindEntityTypeメソッドを使うことです。

タイプを取得したら、問題は対応するDbSet<T>を取得する方法です。 EFコアは現在、EF6に似ている非汎用のSet(Type)メソッドを提供していません。主に非汎用のDbSetクラスがないためです。しかし、あなたはまだ使用して、いくつかのEFコア内部のいずれかによってIQueryableとして対応DbSet<T>を取得することができます:

using System; 
using System.Linq; 
using Microsoft.EntityFrameworkCore.Internal; 

namespace Microsoft.EntityFrameworkCore 
{ 
    public static partial class CustomExtensions 
    { 
     public static IQueryable Query(this DbContext context, string entityName) => 
      context.Query(context.Model.FindEntityType(entityName).ClrType); 

     public static IQueryable Query(this DbContext context, Type entityType) => 
      (IQueryable)((IDbSetCache)context).GetOrAddSet(context.GetDependencies().SetSource, entityType); 
    } 
} 

や反射を経由して、一般的なSet<T>メソッドを呼び出す:あなたはこのようなものを使用することができますどちらの場合も

using System; 
using System.Linq; 
using System.Reflection; 

namespace Microsoft.EntityFrameworkCore 
{ 
    public static partial class CustomExtensions 
    { 
     public static IQueryable Query(this DbContext context, string entityName) => 
      context.Query(context.Model.FindEntityType(entityName).ClrType); 

     static readonly MethodInfo SetMethod = typeof(DbContext).GetMethod(nameof(DbContext.Set)); 

     public static IQueryable Query(this DbContext context, Type entityType) => 
      (IQueryable)SetMethod.MakeGenericMethod(entityType).Invoke(context, null); 
    } 
} 

db.Query("Namespace.MyTable").Where(...) 

または

db.Query(typeof(MyTable)).Where(...) 
+0

これは素晴らしい動作します。私を助けてくれてありがとう、私は本当にこれで苦労していた。 – Guerrilla

+0

この方法で問題が発生しました。 Include()の定義がないため、ネストされたエンティティを含めることができません。これはどうですか? – Guerrilla

+0

これは異なる質問です。しかし、解決方法は 'IQueryable'と' string'を使って同様になり、リフレクションを介して 'Include'メソッドを呼び出します。 –