LINQ to DataSet Вопрос о назначении класса данных - PullRequest
1 голос
/ 03 февраля 2010

Я работаю над проектом Silverlight, пытаясь получить доступ к базе данных с помощью LINQ To DataSet, а затем отправляю данные в Silverlight через веб-сервис .ASMX.

Я определил свой DataSet с помощью инструмента обозревателя сервера (перетаскивая все интересующие меня таблицы). DataSet может получить доступ к серверу и базе данных без проблем.

Ниже приведен код одного из моих веб-методов:

    public  List<ClassSpecification> getSpecifications()
    {
        DataSet2TableAdapters.SpecificationTableAdapter Sta = new DataSet2TableAdapters.SpecificationTableAdapter();

        return (from Spec in Sta.GetData().AsEnumerable()
                select new ClassSpecification()
                {
                    Specification = Spec.Field<String>("Specification"),
                    SpecificationType = Spec.Field<string>("SpecificationType"),
                    StatusChange = Spec.Field<DateTime>("StatusChange"),
                    Spec = Spec.Field<int>("Spec")
                }).ToList<ClassSpecification>();
    }

Я создал класс данных "ClassSpecification", который будет содержать мои данные, и он имеет все поля таблицы в качестве свойств.

У меня вопрос: есть ли более быстрый способ выполнения задания, чем показано здесь? На самом деле есть еще около 10 полей, и я думаю, что, поскольку мой DataSet знает мое определение таблицы, у меня будет более быстрый способ выполнения назначения, чем переход от поля к полю. Я попытался просто "выбрать новую ClassSpecification ()). ToList

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 31 марта 2010

Так вы используете набор данных из-за отсутствия поставщика Linq для базы данных?Это единственная причина, по которой я хотел бы рассмотреть этот шаг.Например, с Linq to Sql вы можете перетащить таблицу и удалить ее.Тогда у вас есть мгновенные объекты с нужной вам формой.

0 голосов
/ 03 февраля 2010

Во-первых, я рекомендую протестировать различные возможности с помощью LINQPad, который бесплатный и потрясающий.

Я не могу вспомнить, что вы можете сделать с помощью настольного адаптера, но вы должны быть в состоянии использоватьDataSet для получения данных, которые вы хотите, например,

string spec = myDataSet.MyTable.Rows[0] // or FindBy... or however you are choosing a row
    .Specification;

Таким образом, вы можете сделать

foreach(var row in myDataSet.MyTable.Rows) {
    string spec = row.Specification;
    ...
}

Или

return (from row in myDataSet.Specification
    select new ClassSpecification()
    {
        Specification = row.Specification,
        SpecificationType = row.SpecificationType,
        StatusChange = row.StatusChange,
        Spec = row.Spec,
    }).ToList<ClassSpecification>();

Или даже

return myDataSet.Specification.Cast<ClassSpecification>()

Не уверен, что последний будет работать, но вы можете видеть, что есть несколько способов получить то, что вы хотите.Кроме того, в моих тестах строка строго типизирована, поэтому вам не нужно создавать новый класс для размещения данных - вы должны просто иметь возможность использовать существующий класс «SpecificationRow».(На самом деле, я полагаю, что это анти-паттерн *1016*. ).

...