Есть ли лучший способ сделать это: присоединиться к различным таблицам данных? - PullRequest
2 голосов
/ 04 июня 2010

Я хочу выполнить JOIN для двух таблиц данных в наборе данных. Например, я работаю над базой данных AdventureWorks. Мне нужны данные из таблиц [Person].[Address] и [Person].[StateProvince], и как только данные находятся в соответствующих таблицах данных, я должен выполнить столбец JOIN для StateProvinceID.

Структура данных -

Address {Address,A_StateID}
State {S_StateID,Name}

Мой поиск в интернете привел меня ко многим примерам, в которых говорилось, что мне придется использовать объект Datarelation для выполнения JOIN. Примеры, которые я нашел, были похожи -

DataColumn childcolumn = dsAdd.Tables["Address"].Columns["A_StateID"];
DataColumn parentcolumn = dsAdd.Tables["State"].Columns["S_StateID"];
DataRelation relStateID = new DataRelation("StateRel", parentcolumn, childcolumn,false);
dsAdd.Relations.Add(relStateID);

Но я понятия не имею, что мне делать после того, как я добавил DataRelation для выполнения JOIN. Итак, я решил сделать это сам -

    //I added a new column to my Address table obtain the State Name after performing the `JOIN`
    DataColumn A_State = new DataColumn("State");
    A_State.DataType = typeof(string);
    dsAdd.Tables["Address"].Columns.Add(A_State);

    foreach (DataRow dr in dsAdd.Tables["Address"].Rows)
    {           
        //for each row in the Address table I obtain the StateID
        string stateid = dr.ItemArray[1].ToString();
        string expression = "S_StateID =" + stateid;

        //Obtain the corresponding row from State table and update the value in new column in Address table 
        DataRow[] newdr;
        newdr = dsAdd.Tables["State"].Select(expression);
        string statename = newdr[0].ItemArray[1].ToString();
        dr.SetField("State", statename.ToString());
    }

    grdJoins.DataSource = dsAdd.Tables["Address"];
    grdJoins.DataBind();

Это прекрасно работает, но есть ли лучший способ сделать это? Как JOIN выполняется с использованием объекта Datarelation?

Ответы [ 2 ]

3 голосов
/ 04 июня 2010

лучший способ сделать это - сделать это в базе данных. Соединения - относительно дорогие и медленные операции; Базы данных существуют как объекты, отделенные от простых наборов таблиц, по двум причинам: обеспечение безопасного параллельного доступа и , позволяющие эффективно выполнять объединения. Они используют все виды приемов, таких как индексация, материализованные представления, кэширование и т. д. уверен, что большая часть тяжелой работы уже сделана для вас.

Следующий лучший способ - использовать linq (для объектов):

grdJoins.DataSource = dsAdd.Tables["Address"].AsEnumerable()
                .Join(dsAdd.Tables["State"].AsEnumerable(),
        add => add["A_StateID"], st => st["S_StateID"],
        (add, st) => new 
      { 
          Address = add["Address"],
          City = add["City"],
          StateProvince = add["StateProvince"],
          State = st["State"]
      });

grdJoins.DataBind();
0 голосов
/ 04 июня 2010

Так что, если я правильно понимаю, что вы спрашиваете, как только вы добавите DataRelation , вы можете позвонить GetChildRows в данной строке, чтобы получить объединил данные. В документации есть пример того, как должен выглядеть код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...