У меня есть 2 таблицы данных, DT1
и DT2
.
DT1
имеет столбцы A1
, B1
, а DT2
имеет столбцы A2
, B2
.
Я бы хотел добавить выражение в A1
лайк A1 = A2 + B2
Возможно ли это сделать без объединения или слияния двух таблиц данных, это похоже на то, как работают электронные таблицы?
Есть ли другой способ сделать это, какие-либо другие структуры данных или методы, кроме DataTable, которые могли бы это сделать?
Я вижу, что DataTable не сможет вывести из строки таблицы, которым принадлежат столбцы?
Возможно ли, что мы можем добавить эти 2 DataTables
к DataSet
, а затем сделать выражение, относящееся к таблицам, присутствующим в DataSet
.
Редактировать:
Я использовал сложение в качестве примера, однако выражения могут иметь несколько комбинаций математических и логических операторов, а иногда и основных математических функций.
@viveknuna Нужно ли мне создавать переменные для ячеек с данными, а затем передавать их в оценщик выражений? Или есть какой-то другой механизм для этого?
См. код ниже
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");
}
Я искал различные виды выражений, между столбцами, и это не ограничивалось добавлением, оно могло иметь комбинацию различных математических и логических операторов и некоторых основных функций. Мой вопрос, возможно, был не таким ясным, я отредактирую его, чтобы передать это.
Я подозревал, что это так, поскольку вы использовали LIKE. Выше приведен только пример, и вы можете изменить его по мере необходимости. Код просто показывает, как перечислить две таблицы. Вам нужно иметь общий столбец между двумя таблицами, чтобы иметь возможность присоединиться, чего не было в вашем сообщении.
В качестве примера такого выражения, как ((A1/A2)*B1) + B2
, я пытался использовать это как строку выражения в третьем параметре dt.Columns.Add(), однако это не разрешает ссылки на перекрестные таблицы.
Вам нужно будет использовать формулу и создать набор данных с обеими таблицами в наборе. Затем см. learn.microsoft.com/en-us/dotnet/api/… и learn.microsoft.com/en-us/dotnet/api/…
Будет ли набор данных автоматически определять таблицы, которым принадлежат столбцы, например. если мы используем ((A1/A2)*B1) + B2
, будет ли DataSet знать, что A1
принадлежит Dt1
, а A2
принадлежит Dt2
Если бы я использовал эту формулу в столбце в Dt2
, я получил бы исключение Cannot find column [A1]
используйте что-то вроде ds.Tables[dt1]
Пробовал поставить выражение на одну из таблиц вот так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.'
См. SalesSet.Relations.Add во втором примере: learn.microsoft.com/en-us/dotnet/api/…
Я думаю, что мы делаем что-то не так, даже после добавления отношения я получаю ту же ошибку. Я добавил такое отношение DataRelation rel = new DataRelation("one2one", ds.Tables["dt1"].Columns["id"], ds.Tables["dt2"].Columns["id"]); ds.Relations.Add(rel);
Вы добавили таблицы в DS? Я изменил приведенный выше код, чтобы добавить таблицу в набор данных.
Вы можете использовать эту библиотеку github.com/codingseb/ExpressionEvaluator