【发布时间】:2019-05-18 15:51:25
【问题描述】:
我正在尝试使用匹配的子对象填充父对象,但无法弄清楚如何仅显示匹配的对象。 我设法获取子对象并将它们添加到列表中,但它显示了父对象的所有子对象。
public ObservableCollection<Book> GetBooks()
{
con.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = con.con;
Book book = new Book();
List<int> IdBooks= new List<int>();
List<Tag> tags = new List<Tag>();
cmd.CommandText = "SELECT b.idBook,b.Title,b.Writer,t.IdTypeOfBook,t.Type FROM tblBook b LEFT OUTER JOIN tblTypeOfBook t ON b.idTypeOfBook = t.idTypeOfBook WHERE b.Active = 1 ORDER BY b.idBook";
SqlDataReader rd = cmd.ExecuteReader();
if (rd.HasRows)
{
while (rd.Read())
{
var idBook = Convert.ToInt32(rd["IdBook"]);
var title = rd["Title"].ToString();
var writer = rd["Writer"].ToString();
var idType = Convert.ToInt32(rd["IdTypeOfBook"]);
var type = rd["Type"].ToString();
book = new Book()
{
IdBook = idBook,
Title = title
};
book.Tags = tags;
Books.Add(book);
IdBooks.Add(idBook);
}
rd.Close();
}
foreach (var idBook in IdBooks)
{
SqlCommand tagCommand = new SqlCommand();
tagCommand.Connection = con.con;
tagCommand.CommandText = "SELECT t.IdTag,t.Name FROM tblTag t LEFT OUTER JOIN tblBookTag bt ON bt.idTag = t.idTag WHERE bt.idBook = @ID";
tagCommand.Parameters.AddWithValue("@ID", idBook);
SqlDataReader tagReader = tagCommand.ExecuteReader();
if (tagReader.HasRows)
{
while (tagReader.Read())
{
Tag tag = new Tag();
var idTag = Convert.ToInt32(tagReader["IdTag"]);
var name = tagReader["Name"].ToString();
tag.IdTag = idTag;
tag.Name = name;
tags.Add(tag);
}
tagReader.Close();
}
}
con.Close();
return Books;
}
目前我只设法显示所有标签,而不是与书匹配的标签。
编辑
这就是现在的样子
public ObservableCollection<Book> GetBooks()
{
con.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = con.con;
Book book = new Book();
cmd.CommandText = "SELECT b.idBook,b.Title,b.Writer,t.IdTypeOfBook,t.Type FROM tblBook b LEFT OUTER JOIN tblTypeOfBook t ON b.idTypeOfBook = t.idTypeOfBook WHERE b.Active = 1 ORDER BY b.idBook";
SqlDataReader rd = cmd.ExecuteReader();
if (rd.HasRows)
{
while (rd.Read())
{
var idBook = Convert.ToInt32(rd["IdBook"]);
var title = rd["Title"].ToString();
var writer = rd["Writer"].ToString();
var idType = Convert.ToInt32(rd["IdTypeOfBook"]);
var type = rd["Type"].ToString();
book = new Book()
{
IdBook = idBook,
Title = title,
Tags = new List<Tag>()
};
Books.Add(book);
}
rd.Close();
}
foreach (var bk in Books)
{
book.Tags = GetTagsThatMatch(bk.IdBook);
}
con.Close();
return Books;
}
public List<Tag> GetTagsThatMatch(int idBook)
{
SqlCommand tagCommand = new SqlCommand();
tagCommand.Connection = con.con;
tagCommand.CommandText = "SELECT t.IdTag,t.Name FROM tblTag t LEFT OUTER JOIN tblBookTag bt ON bt.idTag = t.idTag WHERE bt.idBook = @ID";
tagCommand.Parameters.AddWithValue("@ID", idBook);
SqlDataReader tagReader = tagCommand.ExecuteReader();
if (tagReader.HasRows)
{
while (tagReader.Read())
{
Tag tag = new Tag();
var idTag = Convert.ToInt32(tagReader["IdTag"]);
var name = tagReader["Name"].ToString();
tag.IdTag = idTag;
tag.Name = name;
Console.WriteLine(tag.Name);
Tags.Add(tag);
}
tagReader.Close();
}
return Tags;
}
【问题讨论】:
标签: c# wpf many-to-many sqldatareader sqlcommand