2017-12-31 82 views
2

System.Linq.Dynamic.Core을 사용하여 EF의 쿼리에 람다 식을 동적으로 추가합니다.EF 코어 2.0의 동적 액세스 테이블

이름으로 테이블을 선택할 수도 있습니다. 나는이 대답을 찾을 :

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

을하지만 asp.net 코어 2.0에서 작동하지 않습니다. 사용할 수 없습니다 DbSetDbSet<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 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(...) 
+0

위대한 작품. 도와 주셔서 감사합니다. 저는이 문제로 정말 고심하고있었습니다. – Guerrilla

+0

이 방법으로 문제가 발생했습니다. Include()에 대한 정의가 없으므로 중첩 된 엔터티를 포함 할 수 없습니다. 이 주변의 어떤 방법? – Guerrilla

+0

이것은 다른 질문입니다. 그러나 해결책은'IQueryable'과'string'을 사용하여 비슷하게 될 것이고, 리플렉션을 통해'Include' 메쏘드를 호출 할 것입니다. –