我正在尝试将一个linq写入sql查询,并根据用户提供的输入字符串动态选择在运行时选择哪个表。现在我有一个选择语句执行此操作,但它只重复相同的查询三次,唯一的区别是选定的表。有点像这样:
if (input == "94")
{
var query = from i in db.Table94
select new MyClass(i.A, i.B, i.C);
}
if (input == "95")
{
var query = from i in db.Table95
select new MyClass(i.A, i.B, i.C);
}
//more conditional queries
query = query.Where(addtionalFilteringDoneHere);
DataGridView.DataSource = query;
使用条件Where子句很容易,但我正在寻找类似于表选择的东西。我厌倦了几件事,但他们没有工作。类似的东西:
var query = from i in FetchTable(input)
select new MyClass(i.A, i.B, i.C);
query = query.Where(addtionalFilteringDoneHere);
public returnType FetchTable(string input)
{
//need help here
return db.GetTable<conditionalTable>;
}
我不知道返回类型是什么,或者即使有办法做到这一点。有可能吗?
答案 0 :(得分:0)
由于您尝试从不同的表创建MyClass
实例,因此您遇到了创建动态查询的问题 - 这意味着您抛弃了EF或LINQ-to-SQL - 或者您执行了基本操作而是查找。
我建议进行基本查找,并执行以下操作:
var fetch = new Dictionary<string, Func<Context, IQueryable<MyClass>>>()
{
{ "94", db => db.Table94.Select(i => new MyClass(i.A, i.B, i.C)) },
{ "95", db => db.Table95.Select(i => new MyClass(i.A, i.B, i.C)) },
};
这会在通用字典中创建一个强类型查询,您现在可以轻松地提取MyClass
个实例。
这样的事情:
var query = fetch[input](db).Where(addtionalFilteringDoneHere);
DataGridView.DataSource = query;
如果您更喜欢这种语法,可以使用fetch[input].Invoke(db)
。
这看起来如何解决方案?