我想在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的参数类型传递,然后我的问题就会解决。
答案 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);