У меня есть две таблицы базы данных, многие ко многим
tblBook
idBook
заглавие
писатель
ЭСТ ...
tblBookGenre
Я бы
idBook
idGenre
tblGenre
idGenre
NameGenre
А
tblBook
idBook
заглавие
писатель
ЭСТ ...
tblBookTag
Я бы
idBook
idGenre
tblTag
idTag
* 1025 именные бэджи *
Я отображаю их так
public class Book:INotifyPropertyChanged
{
Connection con = new Connection();
private int _idBook;
private string _title;
private List<Genre> _genres;
private List<Tag> _tag;
private ObservableCollection<Book> _books;
public int IdBook
{
get { return _idBook; }
set { _idBook = value; }
}
public string Title
{
get { return _title; }
set { _title = value; }
}
public List<Genre> Genres
{
get { return _genres; }
set { _genres = value; }
}
public List<Tag> Tags
{
get { return _tag; }
set { _tag = value; }
}
public ObservableCollection<Book> Books
{
get { return _books; }
set { _books = value; }
}
public Book()
{
Tags = new List<Tag>();
Books = new ObservableCollection<Book>();
Genres = new List<Genre>();
}
Я использую sqlcommand и reader для чтения из базы данных
public ObservableCollection<Book> GetBooks()
{
con.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = con.con;
cmd.CommandText = "SELECT idBook,Title FROM tblBook WHERE Active = 1 ORDER BY b.idBook";
SqlDataReader rd = cmd.ExecuteReader();
if (rd.HasRows)
{
while (rd.Read())
{
Book book = new Book();
var id = Convert.ToInt32(rd["IdBook"]);
var title = rd["Title"].ToString();
book.IdBook = id;
book.Title = title;
List<Tag> tags = GetTagsThatMatch(id);
book.Tags = tags;
book.Genres = GetGenresThatMatch(id);
Books.Add(book);
}
rd.Close();
}
con.Close();
return Books;
}
public ObservableCollection<Tag> GetTagsThatMatch(int id)
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = con.con;
cmd.CommandText = "SELECT t.IdTag,t.Name FROM tblTag t LEFT OUTER JOIN tblBookTag bt ON bt.idTag = t.idTag WHERE bt.idBook = @ID";
cmd.Parameters.AddWithValue("@ID", id);
SqlDataReader rd = cmd.ExecuteReader();
if (rd.HasRows)
{
while (rd.Read())
{
Tag tag = new Tag();
tag.IdTag = Convert.ToInt32(rd["IdTag"]);
tag.Name = rd["Name"].ToString();
Tags.Add(tag);
}
}
return Tags;
}
public List<Genre> GetGenresThatMatch(int id)
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = con.con;
cmd.CommandText = "SELECT g.Name FROM tblGenre g LEFT JOIN tblBookGenre bg ON g.IdGenre = bg.IdGenre LEFT OUTER JOIN tblBook b ON bg.IdBook = b.IdBook WHERE b.IdBook = @Id";
cmd.Parameters.AddWithValue("@ID", id);
SqlDataReader rd = cmd.ExecuteReader();
if (rd.HasRows)
{
while (rd.Read())
{
Genre genre = new Genre();
genre.Name = rd["Name"].ToString();
Genres.Add(genre);
}
}
return Genres;
}
Проблема в том, что он отображает все жанры и теги для всех книг
Книга 1 - Жанр 1, Жанр 2, Жанр3
- Tag1, Tag2, Tag3
Книга 2 - Жанр 1, Жанр 2, Жанр3
- Tag1, Tag2, Tag3
Когда должны отображаться только те из них, которые соответствуют
Книга 1 - Жанр 1, Жанр 2
-Tag1, Tag2
Книга 2 - Жанр3
-Tag3
Я бы очень хотел сделать это без ORM, и это кажется простым, но я не могу найти много ресурсов без ORM. Также любые статьи или примеры будут оценены.