使用字符串通过DbContext访问表

时间:2016-09-16 07:20:33

标签: c# entity-framework linq

我想在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>作为参数类型。如果我至少可以找到一种方法来获得Generic Dbset&lt;&gt;我可以将其作为tableName的参数类型传递,然后我的问题就会解决。

1 个答案:

答案 0 :(得分:0)

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

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