Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq到SQL:在运行时动态选择表_C#_.net_Sql_Linq_Runtime - Fatal编程技术网

C# Linq到SQL:在运行时动态选择表

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

我正在尝试编写一个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 = 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。如果表达式类型始终相同,则应用筛选器显然是一项任务。