C# Linq到SQL:在运行时动态选择表
我正在尝试编写一个LINQtoSQL查询,并根据用户提供的输入字符串在运行时动态选择要从中选择的表。现在我有一个selection语句可以这样做,但它只是将同一个查询重复三次,唯一的区别是所选的表。有点像这样:C# Linq到SQL:在运行时动态选择表,c#,.net,sql,linq,runtime,C#,.net,Sql,Linq,Runtime,我正在尝试编写一个LINQtoSQL查询,并根据用户提供的输入字符串在运行时动态选择要从中选择的表。现在我有一个selection语句可以这样做,但它只是将同一个查询重复三次,唯一的区别是所选的表。有点像这样: if (input == "94") { var query = from i in db.Table94 select new MyClass(i.A, i.B, i.C); } if (input == "95") { var query = fro
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;
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)) },
};
var query = fetch[input](db).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>;
}
我不知道返回类型会是什么,甚至不知道是否有办法做到这一点。有可能吗?因为您试图从不同的表创建MyClass实例,所以您遇到了一个问题,要么创建一个动态查询(这意味着您将EF或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;
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)) },
};
var query = fetch[input](db).Where(addtionalFilteringDoneHere);
DataGridView.DataSource = query;
如果您更喜欢这种语法,可以使用fetch[input].Invokedb
这是一个怎样的解决方案?重复的解决方案?这个例子有些误导。两个查询的末尾都有投影,因此在这两种情况下,结果都是IEnumerable。如果表达式类型始终相同,则应用筛选器显然是一项任务。