【问题标题】:Linq to SQL: choose table dynamically at runtimeLinq to SQL:在运行时动态选择表
【发布时间】:2012-07-11 19:25:52
【问题描述】:

我正在尝试编写一个 linq to 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>;
}

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

【问题讨论】:

  • 这个例子有点误导。这两个查询最后都有预测,因此在这两种情况下,您都有IEnumerable&lt;MyClass&gt; 作为结果。如果表达式类型始终相同,那么应用过滤器是一项显而易见的任务。

标签: c# .net sql linq runtime


【解决方案1】:

由于您尝试从不同的表创建 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)

这看起来如何是一种解决方案?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    相关资源
    最近更新 更多