2010-09-21 8 views
-1

Je travaille sur un projet qui va combiner deux listes de points de partage listitem. Il s'agit essentiellement de rassembler trois listes de points de partage.ado.net combine deux lignes en 1

J'ai déjà mes trois requêtes de point de partage pour retourner mes résultats corrects et j'utilise la méthode .GetDataTable() pour générer mes objets pour les jointures LINQ.

Voici mon code. Je vais peut-être aborder cette erreur, mais s'il y a un moyen que je peux retourner une ligne de données qui a tous les trois objets combinés est tout ce dont j'ai besoin.

DataTable dtContracts = _contractList.GetDataTable(); 
     DataTable dtCustomer = _customerList.GetDataTable(); 

     var joined = from contracts in dtContracts.AsEnumerable() 
          join customers in dtCustomer.AsEnumerable() 
          on contracts.Field<String>("ContractNumber") 
          equals customers.Field<String>("ContractNumber") 
          join SPListItem loans in _loanList 
          on contracts["ContractNumber"] equals loans["Contract_x0020_Number"] 
          into JoinedContractLoans 
          from loans in JoinedContractLoans.DefaultIfEmpty() 
          select new { contracts, customers,loans }; 
+0

Quelle est la question? Je pense que votre requête devrait renvoyer la liste des objets qui contiennent les trois objets. – svick

+0

svick, c'est correct et c'est ce que je reçois. Je pense que je rends ceci plus compliqué en essayant d'employer des méthodes vaguement typées. Il est temps de prendre du recul et de réévaluer. Merci à tous d'avoir pris le temps d'examiner. –

+0

@Marek, non, ce n'est pas nécessaire. – svick

Répondre

0

Création d'une nouvelle instance est DataRow pas possible parce que vous ne disposez pas d'un accès direct à the constructor pour créer une instance; vous devez créer un DataTable qui contient toutes les colonnes des trois instances DataTable disparates que vous avez, puis ajouter les lignes via le DataTable.

Bien que ce soit certainement faisable, c'est beaucoup de travail supplémentaire.

Vous pouvez aussi créer un type anonyme/béton qui a tous les champs des instances DataTable séparés et remplir les instances de cela, comme ceci:

// Rest of query the same. 
select new { 
    ContractNumber = contracts.Field<string>("ContractNumber") 
    // All other contract fields. 

    // All customer fields. 

    // All loan fields. 
}; 

Si vous travaillez avec des types anonymes, puis ce serait facile à maintenir. Cependant, pour un cours concret, cela pourrait être un peu compliqué. Cela dit, il ne vous reste plus que ce que vous avez maintenant, en créant un type anonyme qui a des références aux trois lignes de données. C'est probablement le plus facile à maintenir, en supposant que le code qui fonctionne avec ceci est dans la même méthode. Cela dit, si vous deviez passer cela en dehors d'une méthode, je vous recommande d'avoir un data transfer object fortement typé que vous mappez le DataRow pour ensuite renvoyer la collection des trois objets de transfert de données.

Bien sûr, si vous allez sur cette route, alors vous devriez regarder LINQ-to-Entities, car il est essentiellement fait à cet effet (il va probablement simplifier beaucoup de ce code).

Questions connexes