Некорректное отображение linq запроса к связанным таблицам dataset, datatable c#
#40115277
Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
|
|
|
Всем привет. Есть две внутренних БД без использования сервера. Созданы и наполнены через dataset и datatable. Задача: с консоли набрать фамилию автора (можно по первым 3 буквам без учета регистра) и вывести его произведения и их объем. Так вот, мой запрос выводит все произведения, а а авторах один и тот же автор. Помогите, пожалуйста
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127.
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();
}
}
}
|
|