4

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

我有两种观点,MemberDuesPaid 和 MemberDuesOwed。它们在两者中具有相同的字段;(BatchNo、TranDate、DebitAmount、CreditAmount、ReceiptNo、CheckNo、SocSecNo)。

我的应用程序中还有一个助手类,称为 MemberTransaction。它具有所有相同的属性。

我如何在 socSecNo = ssn 传入的两个表之间进行联合?我想联合这两个表并返回 MemberTransaction 的 IEnumerable 集合。将两个表合并在一起后,我希望将返回的集合按 trandate 降序排列。

4

2 回答 2

6

您可以在 Linq 联合查询中执行此操作:

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

这应该会为您返回一个集合,其中所有内容都合并到一个列表中。

[编辑]

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

infoQuery = infoQuery.Distinct();

到这个时候,该变量infoQuery将完全用类型的对象MemberTransaction而不是 union 语句中的两种不同类型填充。

于 2014-06-26T00:23:42.303 回答
1

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

var paid = new List<MemberDuesPaid>();

var owed = new List<MemberDuesOwed>();

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

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

现在你有一个 的集合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;
    }
}
于 2014-06-26T00:21:47.033 回答