Выражение DataTable, ссылающееся на другой столбец DataTable

У меня есть 2 таблицы данных, DT1 и DT2.

DT1 имеет столбцы A1, B1, а DT2 имеет столбцы A2, B2. Я бы хотел добавить выражение в A1лайк A1 = A2 + B2

Возможно ли это сделать без объединения или слияния двух таблиц данных, это похоже на то, как работают электронные таблицы?

Есть ли другой способ сделать это, какие-либо другие структуры данных или методы, кроме DataTable, которые могли бы это сделать?

Я вижу, что DataTable не сможет вывести из строки таблицы, которым принадлежат столбцы? Возможно ли, что мы можем добавить эти 2 DataTables к DataSet, а затем сделать выражение, относящееся к таблицам, присутствующим в DataSet.

Редактировать:

Я использовал сложение в качестве примера, однако выражения могут иметь несколько комбинаций математических и логических операторов, а иногда и основных математических функций.

Вы можете использовать эту библиотеку github.com/codingseb/ExpressionEvaluator

lets do it 19.11.2022 10:35

@viveknuna Нужно ли мне создавать переменные для ячеек с данными, а затем передавать их в оценщик выражений? Или есть какой-то другой механизм для этого?

Anchovy 19.11.2022 11:04
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

См. код ниже

            DataTable dt1 = new DataTable();
            dt1.Columns.Add("ID", typeof(string));
            dt1.Columns.Add("A1", typeof(int));
            dt1.Columns.Add("B1", typeof(int));

            DataTable dt2 = new DataTable();
            dt2.Columns.Add("ID", typeof(string));
            dt2.Columns.Add("A2", typeof(int));
            dt2.Columns.Add("B2", typeof(int));

            DataSet ds = new DataSet()
            ds.Tables.Add(dt1);
            ds.Tables.Add(dt2);

            foreach(DataRow row in dt1.AsEnumerable())
            {
                DataRow match = dt2.AsEnumerable().Where(x => x.Field<string>("ID") == row.Field<string>("ID")).First();
                row["A1"] = match.Field<int>("A2") + match.Field<int>("B2");

            }

Я искал различные виды выражений, между столбцами, и это не ограничивалось добавлением, оно могло иметь комбинацию различных математических и логических операторов и некоторых основных функций. Мой вопрос, возможно, был не таким ясным, я отредактирую его, чтобы передать это.

Anchovy 19.11.2022 11:07

Я подозревал, что это так, поскольку вы использовали LIKE. Выше приведен только пример, и вы можете изменить его по мере необходимости. Код просто показывает, как перечислить две таблицы. Вам нужно иметь общий столбец между двумя таблицами, чтобы иметь возможность присоединиться, чего не было в вашем сообщении.

jdweng 19.11.2022 11:35

В качестве примера такого выражения, как ((A1/A2)*B1) + B2, я пытался использовать это как строку выражения в третьем параметре dt.Columns.Add(), однако это не разрешает ссылки на перекрестные таблицы.

Anchovy 19.11.2022 11:41

Вам нужно будет использовать формулу и создать набор данных с обеими таблицами в наборе. Затем см. learn.microsoft.com/en-us/dotnet/api/… и learn.microsoft.com/en-us/dotnet/api/…

jdweng 19.11.2022 11:45

Будет ли набор данных автоматически определять таблицы, которым принадлежат столбцы, например. если мы используем ((A1/A2)*B1) + B2, будет ли DataSet знать, что A1 принадлежит Dt1, а A2 принадлежит Dt2

Anchovy 19.11.2022 11:57

Если бы я использовал эту формулу в столбце в Dt2, я получил бы исключение Cannot find column [A1]

Anchovy 19.11.2022 12:03

используйте что-то вроде ds.Tables[dt1]

jdweng 19.11.2022 12:46

Пробовал поставить выражение на одну из таблиц вот такdt2.Columns.Add("c2", typeof(int), "(ds.Tables[dt1].Columns[a1] + ds.Tables[dt1].Columns[b1]) - (a2 + b2)"); Но выдает 'Syntax error: Missing operand after '[dt1]' operator.'

Anchovy 19.11.2022 13:42

См. SalesSet.Relations.Add во втором примере: learn.microsoft.com/en-us/dotnet/api/…

jdweng 19.11.2022 16:21

Я думаю, что мы делаем что-то не так, даже после добавления отношения я получаю ту же ошибку. Я добавил такое отношение DataRelation rel = new DataRelation("one2one", ds.Tables["dt1"].Columns["id"], ds.Tables["dt2"].Columns["id"]); ds.Relations.Add(rel);

Anchovy 19.11.2022 19:56

Вы добавили таблицы в DS? Я изменил приведенный выше код, чтобы добавить таблицу в набор данных.

jdweng 20.11.2022 11:40

Другие вопросы по теме