Всем привет. Есть две внутренних БД без использования сервера. Созданы и наполнены через dataset и datatable. Задача: с консоли набрать фамилию автора (можно по первым 3 буквам без учета регистра) и вывести его произведения и их объем. Так вот, мой запрос выводит все произведения, а а авторах один и тот же автор. Помогите, пожалуйста
Screenshot_2.png
Код:
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ex_27
{
class Program
{
static void Main(string[] args)
{
//#27
DataSet authors = new DataSet("authors");
DataTable auth = new DataTable("auth");
// добавляем таблицу в dataset
authors.Tables.Add(auth);
// создаем столбцы для таблицы authors
DataColumn idColumn = new DataColumn("Id", Type.GetType("System.Int32"));
idColumn.Unique = true; // столбец будет иметь уникальное значение
idColumn.AllowDBNull = false; // не может принимать null
idColumn.AutoIncrement = true; // будет автоинкрементироваться
idColumn.AutoIncrementSeed = 1; // начальное значение
idColumn.AutoIncrementStep = 1; // приращении при добавлении новой строки
DataColumn nameColumn = new DataColumn("Name", Type.GetType("System.String"));
auth.Columns.Add(idColumn);
auth.Columns.Add(nameColumn);
// определяем первичный ключ таблицы books
auth.PrimaryKey = new DataColumn[] { auth.Columns["Id"] };
DataRow row = auth.NewRow();
row.ItemArray = new object[] { null, "Пушкин А.С" };
auth.Rows.Add(row); // добавляем первую строку
auth.Rows.Add(new object[] { null, "Гоголь Н.В" }); // добавляем вторую строку
auth.Rows.Add(new object[] { null, "Хемингуэй Э." }); // добавляем вторую строку
Console.Write("\tId \tАвтор"); Console.WriteLine();
foreach (DataRow r in auth.Rows)
{
foreach (var cell in r.ItemArray) Console.Write("\t{0}", cell); Console.WriteLine();
}
DataTable books = new DataTable("books");
authors.Tables.Add(books);
DataColumn IdAuth = new DataColumn("Id", Type.GetType("System.Int32"));
DataColumn countStr = new DataColumn("countStr", Type.GetType("System.Int32"));
DataColumn nameColumnBook = new DataColumn("Name", Type.GetType("System.String"));
books.Columns.Add(IdAuth);
books.Columns.Add(countStr);
books.Columns.Add(nameColumnBook);
DataRow row1 = books.NewRow();
row1.ItemArray = new object[] { 1, 202, "Капитанская дочка"};
books.Rows.Add(row1); // добавляем первую строку
books.Rows.Add(new object[] { 1, 68, "Евгений Онегин"}); // добавляем вторую строку
books.Rows.Add(new object[] { 2, 212, "Мертвые души"}); // добавляем вторую строку
books.Rows.Add(new object[] { 2, 144, "Вечера на хуторе близ Диканьки"}); // добавляем вторую строку
books.Rows.Add(new object[] { 3, 178, "Прощай оружие" }); // добавляем вторую строку
books.Rows.Add(new object[] { 3, 89, "Старик и море" }); // добавляем вторую строку
Console.Write("\n\tId \tОбъём \tПроизведение"); Console.WriteLine();
foreach (DataRow r in books.Rows)
{
foreach (var cell in r.ItemArray) Console.Write("\t{0}", cell); Console.WriteLine();
}
ForeignKeyConstraint foreignKey = new ForeignKeyConstraint(auth.Columns["Id"], books.Columns["Id"])
{
ConstraintName = "authBooksKey",
DeleteRule = Rule.SetNull,
UpdateRule = Rule.Cascade
};
// добавляем внешний ключ в dataset
authors.Tables["books"].Constraints.Add(foreignKey);
// применяем внешний ключ
authors.EnforceConstraints = true;
authors.Relations.Add("authBooks", auth.Columns["Id"], books.Columns["Id"]);
/* DataRow[] rows = row.GetChildRows(authors.Relations["authBooks"]);
Console.Write("\n\tId_AUTH \tПроизведение \tОбъём"); Console.WriteLine();
foreach (DataRow r in rows)
{
Console.WriteLine("{0} \t{1} \t{2}", r["Id"], r["Name"], r["countStr"]);
}*/
Console.WriteLine("Введите фамилию автора: ");
string surname = Console.ReadLine();
/*var manWithOffice = context.Peoples.Join(
context.OfficePeoples, e => e.Id, e => e.Peoples.Id,
(man, hisoffice) => new { people = man, city = hisoffice.Offices.City });*/
/*var q = from DataRow myRow in authors.Tables["auth"].Rows
from DataRow myRow2 in authors.Tables["books"].Rows
where myRow["Name"].ToString().ToUpper().StartsWith("Х")
select new { book = myRow2["Name"], count = myRow2["countStr"], aut = myRow["Name"] };*/
var query = from au in authors.Tables["auth"].AsEnumerable()
from bo in authors.Tables["books"].AsEnumerable()
where au["Name"].ToString().ToUpper().Substring(0,3) == surname.ToUpper().Substring(0, 3)
select new { book = bo["Name"], count = bo["countStr"], aut = au["Name"] };
Console.WriteLine();
foreach (var t in query)
Console.WriteLine("\t{0}\t {1}\t {2}\t", t.count, t.aut, t.book);
Console.ReadKey();
}
}
}