我正在尝试使用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
非常感谢任何帮助。
答案 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,您可以将表拖出并放下。然后你就拥有了你想要的形状的即时对象。