LINQ Union entre deux tables avec les mêmes champs, puis renvoyé dans une collection

J'ai abandonné en essayant de créer une requête linq pour récupérer une vue de server sql qui est une union entre deux tables. Je vais maintenant essayer de créer une union linq.

J'ai deux vues, MemberDuesPaid et MemberDuesOwed. Ils ont les mêmes champs dans les deux; (BatchNo, TranDate, DebitAmount, CreditAmount, RéceptionNo, CheckNo, SocSecNo).

J'ai aussi une class d'aide dans mon application qui s'appelle MemberTransaction. Il a tous les mêmes propriétés.

Comment puis-je faire une union entre les deux tables où socSecNo = le ssn passé? Je veux unir les deux tables et returnner une collection IEnumerable de MemberTransaction. Après que les deux tables sont réunies, je veux que la collection returnnée soit sortingée par ordre décroissant.

Vous pouvez le faire dans une requête Linq Union:

var infoQuery = (from paid in db.MemberDuesPaid select new MemberTransaction() { BatchNo = paid.BatchNo, TranDate = paid.TranDate, DebitAmount = paid.DebitAmount, CreditAmount = paid.CreditAmount, ReceiptNo = paid.ReceiptNo, CheckNo = paid.CheckNo, SocSecNo = paid.SocSecNo}) .Union (from owed in db.MemberDuesOwed select new MemberTransaction() { BatchNo = owed.BatchNo, TranDate = owed.TranDate, DebitAmount = owed.DebitAmount, CreditAmount = owed.CreditAmount, ReceiptNo = owed.ReceiptNo, CheckNo = owed.CheckNo, SocSecNo = owed.SocSecNo}); 

Cela devrait vous renvoyer un set avec tout combiné dans une seule list.

[Modifier]

Si vous voulez des valeurs distinctes, vous pouvez faire quelque chose comme ceci après l'instruction ci-dessus (vous pouvez le faire en ligne si vous mettez tout entre crochets, mais c'est plus simple à expliquer):

 infoQuery = infoQuery.Distinct(); 

La variable infoQuery sera à ce moment entièrement remplie avec des objects de type MemberTransaction plutôt que les deux types disparates dans l'instruction union.

En supposant que vous avez deux collections, une représentant chaque vue:

 var paid = new List<MemberDuesPaid>(); var owed = new List<MemberDuesOwed>(); 

Convertissez les deux collections ci-dessus en instances de la troisième class avant d'effectuer l'union:

 var everyone = paid.Select(x => new MemberTransaction { BatchNo = x.BatchNo, ... }) .Union(owed.Select(x => new MemberTransaction { BatchNo = x.BatchNo, ... })) .Where(x => x.SocSecNo == ssn) .OrderByDescending(x => x.TranDate) .ToList(); 

Maintenant, vous avez une collection de MemberTransaction , mais rien n'indique comment une MemberTransaction est égale à une autre. Donc, si vous exécutez simplement ce qui précède, vous finirez avec tout de deux collections dans le résultat, au lieu d'une véritable union.

Vous devez lui dire ce qui rend deux instances égales, en implémentant IEquatable<T> sur la class MemberTransaction .

 public class MemberTransaction : IEquatable<MemberTransaction> { public int BatchNo { get; set; } public DateTime TranDate { get; set; } public decimal DebitAmount { get; set; } public decimal CreditAmount { get; set; } public int ReceiptNo { get; set; } public int CheckNo { get; set; } public int SocSecNo { get; set; } public bool Equals(MemberTransaction other) { return BatchNo == other.BatchNo && TranDate.Equals(other.TranDate) && DebitAmount == other.DebitAmount && CreditAmount == other.CreditAmount && ReceiptNo == other.ReceiptNo && CheckNo == other.CheckNo && SocSecNo == other.SocSecNo; } }