まず、名前からエンティティのタイプを取得する必要があります(タイプを持っている場合は、そのまま使用してください)。それに対してリフレクションを使うことができますが、おそらく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(...)
TEntity is Gener is is it? – Valkyrie
こちらをご覧くださいhttps://stackoverflow.com/a/44143131/2946329 –