Linq to SQL:在运行时动态选择表

时间:2012-07-11 19:25:53

标签: c# .net sql linq runtime

我正在尝试将一个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>;
}

我不知道返回类型是什么,或者即使有办法做到这一点。有可能吗?

1 个答案:

答案 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)

这看起来如何解决方案?