我有一個控制器類,并且有一個以 tableName 作為引數的方法。并且可以有多達 30 個表/案例的開關案例。
控制器
public async Task<IActionResult> GetData(string tableName, string pRtUnique)
{
var tableEnum = Enum.Parse<AssetInitial>(tableName);
switch (tableEnum )
{
case AssetInitial.Table1:
return Ok(ApiResult<List<Table1>>.Success200(await _extractService.GetDataAsync<Table1>(pRtUnique)));
break;
case AssetInitial.Table2: ..... break;
case AssetInitial.Table3: ..... break;
case AssetInitial.Table30: ..... break;
}
}
界面
public interface IExtractService
{
public Task<List<TEntity>> GetDataAsync<TEntity>( string pRtUnique) where TEntity : BaseEntity;
}
實施:
public class ExtractService : IExtractService
{
private readonly DbContext _context;
public ExtractService(DbContext context)
{
_context = context;
}
public async Task<List<TEntity>> GetDataAsync<TEntity>(string pRtUnique) where TEntity : BaseEntity
{
return await _context.Set<TEntity>().Where(x => x.RtUnique== pRtUnique).ToListAsync();
}
}
我可以從基于表的控制器類中獲得通用的一個代碼/呼叫嗎?不喜歡簡單地使用 30 個條件的 switch 陳述句來從表中檢索資料。嗨,希望您了解我目前面臨的挑戰。我可以有一個適用于所有表的方法呼叫嗎?
uj5u.com熱心網友回復:
您在這里有一個視圖選項來實作您想要的。
- 您可以使用 EF 和 DbContext.Set 方法
- 您可以為您的表創建存盤程序/查詢以及該方法需要呼叫的內容。
- 最后您可以創建 SQL 運算式并插入表名
第一個看起來像這樣:
DbContext.Set(System.Type.GetType("tableName"))
第二個可能是這樣的
var db = new DbContext();
var list = db.ExecuteStoreQuery<Obj>(Obj.sql);
class Obj
{
public const string sql = @"select [tbl].[field] from [tbl]";
}
最后你可以做一個 sql 查詢發送過來,它的作業原理是一樣的。
var query =$"select * from {table} where <some_condition>";
var list = db.ExecuteStoreQuery<Obj>(query);
這些都可以作業并實作您能夠將 tableName 傳遞到方法并回傳通用物件型別結果的目標。我確信還有其他方法,但過去我通常只是創建一個字串并制作一個自定義 sql 查詢字串并使用 ExecuteStoreQuery<>() 發送到資料庫。
uj5u.com熱心網友回復:
我在反射和 MakeGenericMethod 的幫助下解決了。有關詳細資訊,請參閱鏈接 https://docs.microsoft.com/en-us/dotnet/api/system.reflection.methodinfo.makegenericmethod?view=net-6.0
public class EnityRepository<TEntity> : IEnityRepository<TEntity> where TEntity : BaseEntity
{
private readonly DContext _context;
public EnityRepository(DContext context)
{
_context = context;
}
public async Task<List<object>> GetDataAsync(string tablename, string pRtUnique)
{
List<TEntity> result = new List<TEntity>();
var type = Assembly.GetExecutingAssembly().GetTypes().FirstOrDefault(t => t.Name == tablename);
var tableSet = _context.Set<TEntity>(type);
result = await tableSet.Where(x => x.RtUnique == pRtUnique).ToListAsync();
return result.Cast<object>().ToList();
}
}
//Created extension method
public static class ContextSetExtension
{
public static IQueryable<TEntity> Set<TEntity>(this HIVEiKYTCDContext _context, Type t) where TEntity : BaseEntity
{
var method = typeof(DContext).GetMethods().Single(p => p.Name == nameof(DContext.Set) && p.ContainsGenericParameters && !p.GetParameters().Any());
method = method.MakeGenericMethod(t);
var res = method.Invoke(_context, null);
return (IQueryable<TEntity>)res;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/430388.html
標籤:C# asp.net-mvc 实体框架核心
上一篇:ServiceStack管理界面
