我正在编写一个应用程序,我需要抽象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);
}
大意来自这篇文章
reflection-linq-dbset
定义方法的返回类型为List
public List<dynamic> GetAll(string Table)
{
//your code...
return Enumerable.ToList(invokeSet);
}
活动类:
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);