Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль

Купить рекламу на форуме 15-35 тыс рублей в месяц

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2021, 15:01   #1
Alena16
 
Регистрация: 12.11.2021
Сообщений: 7
Восклицание Некорректное отображение linq запроса к связанным таблицам dataset, datatable c#

Всем привет. Есть две внутренних БД без использования сервера. Созданы и наполнены через 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();
        }
    }
}
Alena16 вне форума Ответить с цитированием
Старый 08.12.2021, 20:39   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,499
По умолчанию

потому что не два from нужно писать, а делать join, связывая таблицы по какому-то там свойству.
https://docs.microsoft.com/ru-ru/dot...oin-operations
pu4koff вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запрос к связанным таблицам SAMOUCHKA SQL, базы данных 4 23.06.2019 21:26
Как узнать количество полученных записей в результате запроса LINQ to DataSet? Гаврилов C# (си шарп) 5 03.09.2012 16:21
Фильтр по связанным таблицам lition1 БД в Delphi 11 01.04.2011 23:42
Заполнение DataTable из LINQ-запроса tavrocotaps Общие вопросы .NET 0 13.08.2010 14:43
Поиск по связанным таблицам Таня84 БД в Delphi 1 22.02.2007 10:37