[英]DbSet variable table name
我正在編寫一個需要抽象 DbSet 表名的應用程序。 下面的代碼不調用_db.Activities.ToList() (其中 Activity 是 Sql 中的表),而是適用於任何變量表輸入。
現在我想在現有代碼之上使用.Where()、.OrderBy()、.FromSqlRaw()和其他方法。
例如,如何使用可變表名編寫 _db.Activities.FromSqlRaw(...),就像它為 GetAll 方法所做的那樣。
這是我的活動 DbSet
public virtual DbSet<Activity> Activities { get; set; } = null!;
這是從變量表中獲取所有記錄的方法
public dynamic GetAll(string Table)
{
var curEntityPI = _db.GetType().GetProperty(Table);
var curEntityType = curEntityPI.PropertyType.GetGenericArguments().First();
// Getting Set<T> method
var method = _db.GetType().GetMember("Set").Cast<MethodInfo>().Where(x => x.IsGenericMethodDefinition).FirstOrDefault();
// Making Set<SomeRealCrmObject>() method
var genericMethod = method.MakeGenericMethod(curEntityType);
// invoking Setmethod into invokeSet
dynamic invokeSet = genericMethod.Invoke(_db, null);
// invoking ToList method from Set<> invokeSet
return Enumerable.ToList(invokeSet);
}
總體思路來自這篇文章
將方法的返回類型定義為List<dynamic>而不是dynamic
public List<dynamic> GetAll(string Table)
{
//your code...
return Enumerable.ToList(invokeSet);
}
活動 Class:
public class Activity
{
public int Field1 { get; set; }
public string Field2 { get; set; }
}
所以,你可以使用 List 類型的所有方法
var activityList = GetAll("Activities");
var filteredList = activities.Where(x => x.Field1 > 1);
var orderedList = filteredList.OrderBy(x => x.Field2);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.