2010-06-04 2 views
2

Je souhaite effectuer un JOIN sur deux fichiers de données dans un jeu de données. Par exemple, je travaille sur la base de données AdventureWorks. J'ai besoin des données des tables [Person].[Address] et [Person].[StateProvince] et une fois que les données sont dans les données correspondantes, je dois effectuer une colonne JOIN sur StateProvinceID.Existe-t-il un meilleur moyen de le faire: Se joint à des données différentes?

Structure des données -

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

Ma recherche sur Internet m'a conduit à beaucoup d'exemples qui dit que je vais devoir utiliser un objet DataRelation afin d'effectuer une JOIN. Les exemples que je trouvais étaient comme -

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); 

Mais, je ne sais pas ce que je dois faire après avoir ajouté un DataRelation pour effectuer la JOIN. Donc, j'ai décidé de le faire moi-même -

//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(); 

Cela fonctionne bien, mais y at-il une meilleure façon de le faire? Comment un JOIN est-il effectué à l'aide d'un objet Datarelation?

+0

BTW ... J'espère que cela est une application de l'héritage que vous travaillez sur et ne pas utiliser DatSets pour un nouveau développement. – R0MANARMY

+0

Un ensemble de données ne devrait-il pas être utilisé du tout? Pourquoi? Les inconvénients de performance de l'ensemble de données sont-ils si profonds? – pavanred

+0

Pas la performance, il y a juste de meilleurs outils là-bas. Jetez un oeil à [Quels sont les avantages de l'utilisation d'un ORM?] (Http://stackoverflow.com/questions/398134/what-are-the-advantages-of-using-an-orm) comme point de départ. – R0MANARMY

Répondre

3

Le meilleur meilleur pour ce faire est de le faire sur la base de données. Les jointures sont des opérations relativement coûteuses et lentes; les bases de données existent en tant qu'entités distinctes des simples collections de tables pour deux raisons: l'application d'un accès concurrent sécurisé et pour vous permettre d'effectuer des jointures efficacement. Ils utilisent toutes sortes de trucs comme l'indexation, les vues matérialisées, la mise en cache, etc., pour s'assurer que la plus grande partie de la levée de poids est déjà faite pour vous.

La meilleure façon est d'utiliser LINQ (objets):

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

Vouliez-vous dire [Linq to DataSet] (http://msdn.microsoft.com/fr-fr/library/bb386977).aspx) au lieu de Linq to Objects (puisque vous débutez avec un DataSet au lieu d'une collection régulière)? – R0MANARMY

+0

@ R0MANARMY seulement dans le sens où linq to dataset est vraiment juste une partie de linq to objects. Notez l'appel à AsEnumerable() - il utilise les mêmes éléments que n'importe quel autre linq pour les objets énumérables. –

+0

@ R0MANARMY - linq to datasets est juste une énumération droite sur un ensemble de données. C'est juste un nom marketing pour ce qui est déjà là. Les échantillons linq to datasets doivent tous aussi appeler AsEnumerale(). –

0

Donc, si je comprends ce que vous demandez correctement, une fois que vous avez ajouté un DataRelation vous pouvez faire un appel à GetChildRows sur une ligne donnée pour obtenir le joint données. La documentation a un exemple de ce à quoi devrait ressembler le code.

Questions connexes