1

我正在开发一个 Silverlight 项目,尝试使用 LINQ To DataSet 访问数据库,然后通过 .ASMX Web 服务将数据发送到 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

任何帮助将不胜感激。

4

2 回答 2

0

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

于 2010-03-31T02:21:10.167 回答
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”类。(其实我相信这就是贫血的领域模型反模式。)

于 2010-02-03T00:27:16.687 回答