LINQ联盟在具有相同字段的两个表之间然后在集合中返回

Bil*_*l G 4 c# sql linq sql-server devforce

我已经放弃尝试创建一个linq查询来检索一个sql server视图,它是两个表之间的联合.我现在将尝试创建一个linq联盟.

我有两个视图,MemberDuesPaid和MemberDuesOwed.他们两个都有相同的领域; (BatchNo,TranDate,DebitAmount,CreditAmount,ReceiptNo,CheckNo,SocSecNo).

我的应用程序中还有一个名为MemberTransaction的帮助器类.它具有所有相同的属性.

如何在两个表之间建立联合,其中socSecNo = ssn传入?我想结合两个表并返回一个IEnumerable MemberTransaction集合.在将两个表联合在一起后,我希望按降序顺序返回由trandate排序的集合.

Jan*_*e S 6

您可以在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});
Run Code Online (Sandbox Code Playgroud)

这应该会返回一个集合,所有内容组合成一个列表.

[编辑]

如果你想要不同的值,你可以在上面的语句之后做这样的事情(如果你把所有内容括起来,你可以内联,但这更容易解释):

infoQuery = infoQuery.Distinct();
Run Code Online (Sandbox Code Playgroud)

此时变量infoQuery将完全填充类型的对象,MemberTransaction而不是union语句中的两个不同类型.


Gra*_*ICA 1

假设您有两个集合,一个代表每个视图:

var paid = new List<MemberDuesPaid>();

var owed = new List<MemberDuesOwed>();
Run Code Online (Sandbox Code Playgroud)

在执行联合之前将上面的两个集合转换为第三类的实例:

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();
Run Code Online (Sandbox Code Playgroud)

现在您已经得到了 的集合MemberTransaction,但没有任何内容可以表明其中一个如何MemberTransaction等于另一个。因此,如果您只运行上面的代码,您最终会在结果中得到两个集合中的所有内容,而不是真正的并集。

您必须通过IEquatable<T>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;
    }
}
Run Code Online (Sandbox Code Playgroud)