使用字符串通过DbContext访问表
本文关键字:DbContext 访问表 字符串 | 更新日期: 2023-09-27 18:07:10
我想在LINQ查询中传递一个字符串。
string TableName = "db.Countries";
var ActualData = (from n in TableName
where n.Record_Instance >= 0
select n).OrderBy(primaryColumn);
我的目的是;我想把查询放到一个方法中,需要时调用它。基本上改变TableName并将其作为函数调用的参数传递。
有办法做到这一点吗?
更新:
解决方法:
var TableName = db.Countries;
GetConditionaldata(TableName,..);
private object GetConditionaldata( DbSet<Country> TableName, ..)
{
var ConditionalData = (from n in TableName
where n.Record_Instance >= 0
select n).OrderBy(primaryColumn);
var count = ConditionalData.Count();
var countries = ConditionalData.Skip(jtStartIndex).Take(jtPageSize);
return countries;
}
但是在这里,我想再次指定DbSet<Country>
作为参数类型。如果我至少能找到一种方法来获得一个通用的Dbset<>,我可以传递作为参数类型为我的tableName,那么我的问题就解决了。
假设您有多个包含您想要执行相同查询的相同属性的实体,那么您可以引入一个接口:
public interface IInstanceRecord
{
int Record_Instance { get; set; }
}
然后将其应用于部分类中的实体(或者如果使用Code First则直接应用):
public partial class Country : IInstanceRecord { }
public partial class Foo : IInstanceRecord { }
public partial class Bar : IInstanceRecord { }
现在你可以使你的方法泛型,并添加一个约束,它所操作的泛型类型必须实现IInstanceRecord
:
public IQueryable<T> GetConditionalData<T>(IQueryable<T> dbSet, ...)
where T : IInstanceRecord
{
var conditionalData = (from n in dbSet
where n.Record_Instance >= 0
select n).OrderBy(primaryColumn);
var count = conditionalData.Count();
var filteredData = conditionalData.Skip(jtStartIndex).Take(jtPageSize);
return filteredData;
}
用任何DbSet<T>
(或其他IQueryable<T>
)来命名它,只要T : IInstanceRecord
:
var filteredCountries = GetConditionalData(dbContext.Countries);
var filteredFoos = GetConditionalData(dbContext.Foos);
var filteredBars = GetConditionalData(dbContext.Bars);