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排序的集合.
您可以在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语句中的两个不同类型.
假设您有两个集合,一个代表每个视图:
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)