簡體   English   中英

從類型名稱調用具有泛型類型的 EF Core 方法

[英]Call EF Core method with generic type from type name

我有一個應用程序記錄要在以后執行的查詢列表。 所以我有一個包含這樣的列表:

class QueryToBeExecutedLater
{
    string sql { get; set; }
    object[] parameters { get; set; }
    string entityTypeFullName { get; set; }
}

我需要像這樣執行它們:

List<QueryToBeExecutedLater> allQueries = ...

foreach(var q in allQueries )
{
    Type elementType = Type.GetType(q.entityTypeFullName);
    var result = await db.Set<elementType>.FromSqlRaw(q.sql,q.parameters).ToListAsync();
}

但它當然行不通。

我對反射不是很熟悉。 到目前為止,我已經能夠通過以下方式獲得 dbSet:

List<QueryToBeExecutedLater> allQueries = ...

foreach(var q in allQueries )
{
    Type elementType = Type.GetType(q.entityTypeFullName);
    MethodInfo method = typeof(myDbContext).GetMethod("Set",
                                  BindingFlags.Public | BindingFlags.Static);
    method = method.MakeGenericMethod(elementType);
    var _dbSet = method.Invoke(db,null);

    var result = _dbSet.FromSqlRaw(q.sql,q.parameters);
}

這當然行不通,因為:

在此處輸入圖像描述

我可能應該做這樣的事情:

List<QueryToBeExecutedLater> allQueries = ...

foreach(var q in allQueries )
{
    Type elementType = Type.GetType(q.entityTypeFullName);
    MethodInfo method = typeof(myDbContext).GetMethod("Set",
                                  BindingFlags.Public | BindingFlags.Static);
    method = method.MakeGenericMethod(elementType);
    var _dbSet = method.Invoke(db,null);

    var typeReturnedByInvoke_type_of_dbset = **...How Do I Get this type?...**
    MethodInfo _method = typeReturnedByInvoke_type_of_dbset.GetMethod("FromSqlRaw",
                                  BindingFlags.Public | BindingFlags.Static);

    object[] frontParameter = { sql };
    var allParameters = frontParameter.Concat(parameters).ToArray();

    // The "null" is because it's a static method
    var result = _method.Invoke(_dbSet, allParameters);
}

但是如何獲得method.Invoke結果的類型?

或者有沒有辦法避免所有這些調用,只需將第一次調用的結果轉換為正確的DbSet<elementType>並從那里繼續而不進行反射?

預先感謝您的任何幫助!

您已經知道如何通過反射調用單個泛型方法,這就是您所需要的。 只需引入一個RunQuery<TEntity>並調用它。

例如

    public static List<object> RunQuery(QuerySpec query, DbContext db)
    {
        Type elementType = Type.GetType(query.entityTypeFullName);
        var rv = typeof(Program).GetMethod("RunQuery2", BindingFlags.Static | BindingFlags.NonPublic)
                                .MakeGenericMethod(elementType)
                                .Invoke(null, new object[] { query, db });
        return (List<Object>)rv;

    }
    private static List<object> RunQuery2<T>(QuerySpec query, DbContext db) where T : class
    {
        var rv = db.Set<T>().FromSqlRaw(query.sql, query.parameters)
                   .Select( e=>(object)e )
                   .ToList();
        return rv;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM