Имена динамических таблиц в Linq to SQL

Привет всем, у меня ужасная база данных, с которой мне нужно работать, и linq to sql - это вариант, который я использую для извлечения данных. anywho я пытаюсь повторно использовать функцию, добавляя другое имя таблицы на основе выбора пользователя, и, насколько мне известно, нет способа изменить TEntity или Table ‹> в запросе 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 перечисляемыми записями.


person Ayo    schedule 12.02.2009    source источник


Ответы (2)


Вы можете вызвать метод ExecuteQuery для экземпляра DataContext. Вам нужно будет вызвать перегрузку, которая принимает экземпляр Type, описанный здесь:

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

Предполагая, что у вас есть тип, который правильно атрибутирован для таблицы, передача этого экземпляра Type для этого типа и SQL даст вам то, что вы хотите.

person casperOne    schedule 13.02.2009

Как уже ответил casperOne, вы можете использовать первую перегрузку метода ExecuteQuery (тот, который запрашивает параметр типа). Поскольку у меня была аналогичная проблема, и вы задали пример, вот один:

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);
person AdrianoRR    schedule 13.11.2012