簡體   English   中英

DbSet 變量表名

[英]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); 
        }

總體思路來自這篇文章

反射-linq-dbset

將方法的返回類型定義為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.

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