使用字符串通过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,那么我的问题就解决了。

使用字符串通过DbContext访问表

假设您有多个包含您想要执行相同查询的相同属性的实体,那么您可以引入一个接口:

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);