[英]Why is LINQ OrderByDescending not working with a view composed of a union between two tables?
[英]LINQ Union between two tables with the same fields and then returned in a collection
我已經放棄嘗試創建一個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});
這應該會返回一個集合,所有內容組合成一個列表。
[編輯]
如果你想要不同的值,你可以在上面的語句之后做這樣的事情(如果你把所有內容括起來,你可以內聯,但這更容易解釋):
infoQuery = infoQuery.Distinct();
此時變量infoQuery
將完全填充MemberTransaction
類型的對象,而不是union語句中的兩個不同類型。
假設你有兩個集合,一個代表每個視圖:
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
如何等於另一個。 因此,如果您只運行上述內容,您將最終獲得結果中兩個集合的所有內容 ,而不是真正的聯合。
你必須通過在MemberTransaction
類上實現IEquatable<T>
來告訴它是什么讓兩個實例相等。
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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.