Как получить доступ к Parents Child в выражении DataColumn

У меня есть набор данных с 3 таблицами данных:

dtPerson

dtЗарплата

dtFriend

У каждого человека есть зарплата, и у каждого человека есть один друг.

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

Итак, dtPerson имеет столбец NAME, dtSalary имеет столбец VALUE, а dtFriend имеет столбец NAME.

Я добавил столбец dcHisFriend и установил для Expression следующее:

dtSalary.Add(dcHisFriend);

dcHisFriend.Expression = Max(Parent.Child(Persons_Friend).NAME);

Но это явно не работает.

Подскажите, пожалуйста, как ввести в столбец dcHisFriend имя друга человека с окладом в таблице окладов?


person Tomasz Smykowski    schedule 26.02.2009    source источник
comment
Не могли бы вы опубликовать имена столбцов первичных/внешних ключей? То есть, учитывая зарплату, как вы вернетесь к Человеку и как вы вернетесь к другу с зарплаты. Тогда, возможно, у меня будет решение для вас.   -  person BFree    schedule 26.02.2009


Ответы (2)


Я думаю, что нет способа получить доступ к любой другой строке в «Выражении» в DataColumn.

Единственный способ добиться аналогичного поведения — подключиться к событию DataColumnChanged в DataTables, где находятся исходные данные, а затем установить вычисляемое значение в обычный столбец (= столбец без выражения).

person TcKs    schedule 26.02.2009

На самом деле есть способ сделать это, при условии, что отношения между вашими таблицами 1 к 1 (хотя отсутствующие строки не являются большой проблемой): создайте два отношения, а не одно, т.е.

var joinColT1 = table1.Columns["ID"];
var joinColT2 = table2.Columns["FK_IDT1"];
var rel1 = new DataRelation("R1To2", joinColT1, joinColT2, false);
var rel2 = new DataRelation("R2To1", joinColT2, joinColT1, false);
theDataSet.Relations.Add(rel1);
theDataSet.Relations.Add(rel2);
// Add the column you're after
var hisFriend = new DataColumn("HisFriend", typeof(string), "Parent([R2To1]).[HisFriend]");
table1.Columns.Add(hisFriend);
// Add a back-reference to the other table against the friend if you want, too
var hisFriendsSalary = new DataColumn("HisFriendsSalary", typeof(decimal) "Parent([R1To2]).[Salary]");
table2.Columns.Add(hisFriendsSalary);

Тем не менее, пара замечаний: во-первых, когда я впервые экспериментировал с этим, я получил синтаксические ошибки без квадратных скобок вокруг имен отношений в выражении. Хотя это могло быть просто связано с именами, которые я использовал для отношений.

Во-вторых, я считаю, что результат выражений хранится в строках (они не вычисляются «как раз вовремя» при доступе, они вычисляются при изменении значений, а результаты сохраняются). Это означает, что вы сохраняете данные дважды, используя этот подход. Иногда это нормально, а иногда нет.

В-третьих, вы заметите, что я не использую ограничения. Это потому, что в моих типичных случаях использования я не ожидаю, что каждая строка будет иметь аналог в другой таблице (вот почему в первую очередь есть две таблицы, довольно часто!). Это может (я не проверял dotnetframework.org) повлиять на производительность.

person tobriand    schedule 25.03.2018