먼저 이름에서 엔티티 유형을 가져와야합니다 (유형이있는 경우 직접 사용하십시오). 리플렉션을 사용할 수는 있지만 EF 코어의 올바른 방법은 FindEntityType
메서드를 사용하는 것입니다.
유형이 있으면 문제는 해당 DbSet<T>
을 얻는 방법입니다. EF Core는 현재 비 일반 클래스가 없으므로 EF6과 비슷한 비제 제 Set(Type)
메서드를 제공하지 않습니다. 그러나 당신은 여전히 사용하여 일부 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 –