Linq to SQL中的动态表名

时间:2009-02-12 22:06:30

标签: sql linq-to-sql dynamic ienumerable

大家好我有一个可怕的数据库我必须使用和linq到sql是我从中检索数据的选项。我试图通过基于用户选择引入不同的表名来重用函数,并且我无法修改TEntity或表<>在DataContext查询中。

这是我目前的代码。

public void GetRecordsByTableName(string table_name){

string sql = "Select * from " + table_name;
var records = dataContext.ExecuteQuery</*Suppossed Table Name*/>(sql);

ViewData["recordsByTableName"] = records.ToList();
}

我想用可枚举记录填充我的ViewData。

2 个答案:

答案 0 :(得分:3)

您可以在DataContext实例上调用ExecuteQuery方法。您将需要调用带有Type实例的重载,如下所示:

http://msdn.microsoft.com/en-us/library/bb534292.aspx

假设您有一个正确归因于该表的类型,为该类型传递该Type实例,SQL将为您提供所需的内容。

答案 1 :(得分:0)

正如casperOne已经回答的那样,您可以使用ExecuteQuery方法首先重载(请求Type参数的方法)。既然我遇到了类似的问题,你问了一个例子,这里有一个:

public IEnumerable<YourType> RetrieveData(string tableName, string name)
        {
            string sql = string.Format("Select * FROM {0} where Name = '{1}'", tableName, name);

            var result = YourDataContext.ExecuteQuery(typeof(YourType), sql);

            return result;
        }

请注意YourType,因为您必须定义具有构造函数的类型(它不能是抽象或接口)。我建议您创建一个与SQL表具有完全相同属性的自定义类型。如果这样做,ExecuteQuery方法将自动将表中的值“注入”到自定义类型。像那样:

//This is a hypothetical table mapped from LINQ DBML

[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.ClientData")]
    public partial class ClientData : INotifyPropertyChanging, INotifyPropertyChanged
    {
private int _ID;

        private string _NAME;

        private string _AGE;
}

//This would be your custom type that emulates your ClientData table

public class ClientDataCustomType 
    {

        private int _ID;

        private string _NAME;

        private string _AGE;
}

因此,在前一个示例中,ExecuteQuery方法将是:

var result = YourDataContext.ExecuteQuery(typeof(ClientDataCustomType), sql);