SQL中基于一对多表关系填充对象我在C#中有这样一个对象:privateClassWidget{publicintID;publicListWidgetFavoriteNumbers;假设我在SQL中有两个表,一个定义小部件属性,另一个包含单个小部件的许多记录,假设小部件最喜欢的数字:小部件----------id(int,notnull)//otherproperties...widget_nums----------widget_id(int,notnull)num(int)我发现自己经常执行两个SQL查询来填充这个对象,即使我知道我可以加入表来创建查询。原因是只用我需要的数据填充对象似乎更简单,而不是用大量重复数据遍历结果集。当然,这个widget的例子比起真实场景要简单的多。这是一个例子:intWidgetID=8;ClassWidgetMyWidget=newClassWidget();使用(SqlConnectionconn=GetSQLConnection()){使用(SqlCommandcmd=conn.CreateCommand()){conn.Open();cmd.CommandText=@"SELECTidFROMwidgetsWHEREid=@WidgetID;";cmd.Parameters.AddWithValue("WidgetID",WidgetID);使用(SqlDataReaderReader=cmd.ExecuteReader()){如果(Reader.HasRows)MyWidget.ID=GetDBInt("id",Reader);//读取数据库结果的自定义方法}cmd.CommandText=@"SELECTnumFROMwidget_numsWHEREwidget_id=@WidgetID;";使用(SqlDataReaderReader=cmd.ExecuteReader()){if(Reader.HasRows)while(Reader.Read())MyWidget.WidgetFavoriteNumbers.Add(GetDBInt("num",Reader));}conn.Close();我的问题是我应该继续使用这种方法,还是建议执行表连接。如果推荐表连接,填充对象的最佳设计模式是什么?我的问题是我必须创建一些逻辑来过滤掉重复的行,这在我获取所有小部件而不是一个小部件时尤其复杂。我会使用表连接。创建一个迭代结果的方法非常简单。您甚至可以在查询多个小部件及其widget_nums时使用此方法privateIEnumerableMapReaderToWidget(IDataReaderreader)while(reader.Read()){varid=(int)reader["id"];ClassWidget小部件;如果(!dict.TryGetValue(id,outwidget)){widget=newClassWidget{ID=id,WidgetFavoriteNumbers=newList();};dict.Add(id,widget);}widget.WidgetFavoriteNumbers.Add((int)reader["num"]);}返回dict.Values;}然后重写你的方法如下:using(SqlConnectionconn=GetSQLConnection()){cmd.CommandText=@"SELECTidFROMwidgetsINNERJOINwidget_numson....WHEREid=@WidgetID;";cmd.Parameters.AddWithValue("WidgetID",WidgetID);使用(SqlDataReaderReader=cmd.ExecuteReader()){returnMapReaderToWidget(reader).FirstOrDefault();}}}使用表连接。它使用单个SQL查询并且速度非常快(比您当前的方法快得多)。对于过滤掉重复行的逻辑,我想你可以想出一个查询;花一些时间开发一个查询,让您从数据库中得到您想要的信息,您会对结果感到满意。我认为你应该开始转向AdoEntityFramework或LinQtoSQL作为数据提供者,因为它会为你节省很多时间,而且它会以高效的方式做你想做的事。以上就是C#学习教程:基于SQL中的一对多表关系填写对象共享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
