Динамические имена таблиц в Linq to SQL - PullRequest
3 голосов
/ 13 февраля 2009

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

Ответы [ 2 ]

3 голосов
/ 13 февраля 2009

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

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

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

0 голосов
/ 13 ноября 2012

Поскольку casperOne уже ответил, вы можете использовать метод ExecuteQuery first overload (тот, который запрашивает параметр 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);
...