DbSet变量表名



我正在编写一个应用程序,我需要抽象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);

相关内容

  • 没有找到相关文章

最新更新