LINQ to DataSet Dataclass赋值问题

时间:2010-02-02 23:17:09

标签: c# silverlight linq-to-dataset datatableadapters

我正在尝试使用LINQ To DataSet访问数据库,然后通过.ASMX Web服务将数据发送到Silverlight的Silverlight项目。

我使用Server Explorer工具定义了我的DataSet(拖放我感兴趣的所有不同的表)。 DataSet能够毫无问题地访问服务器和数据库。

以下是我的一个Web方法的代码:

    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 :(得分:0)

首先,我建议使用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”类。 (事实上​​,我认为这是anemic domain model anti-pattern。)

答案 1 :(得分:0)

您是否因为缺少数据库的Linq提供程序而使用数据集?这是我考虑这一举措的唯一原因。例如,使用Linq to Sql,您可以将表拖出并放下。然后你就拥有了你想要的形状的即时对象。