2014-08-31 76 views
1

我有一些數據從數據庫中查詢,但如果沒有特定財政年度的記錄,它不會返回到我的列表中。我需要返回所有財務年度,但實際信息(GrossEx,GST,GrossInc)應全部爲空。有效地將信息添加到列表中。 Linq聯盟?

public class FinancialData 
{ 
    public string FinancialYear { get; set; } 
    public string Type { get; set; } 
    public decimal? GrossEx { get; set; } 
    public decimal? GST { get; set; } 
    public decimal? GrossInc { get; set; } 
} 

如何有效地補充FinancialYears,2004年至2015年(含毛,GST和GrossInc爲空),我的列表中,如果它們不存在?

List<FinancialData> financialDataBucket = new List<FinancialData>(); 

FinancialData entry1 = new FinancialData { FinancialYear = "2012 - 2013", GrossEx = 1, GrossInc = 1, GST = 1 }; 
FinancialData entry2 = new FinancialData { FinancialYear = "2013 - 2014", GrossEx = 1, GrossInc = 1, GST = 1 }; 

financialDataBucket.Add(entry1); 
financialDataBucket.Add(entry2); 

我試過用linq比較器做一個聯盟,但由於某種原因它沒有工作,我不明白爲什麼?這是解決我的問題的最好方法嗎?

var merged = allFinancialYearsData.Union(financialDataBucket, new EqComparer()); 

public class EqComparer : IEqualityComparer<FinancialData> 
{ 
    public bool Equals(FinancialData x, FinancialData y) 
    { 
     return x.FinancialYear == y.FinancialYear; 
    } 

    public int GetHashCode(FinancialData obj) 
    { 
     return obj.GetHashCode(); 
    } 
} 

編輯:

所以,我想無論是創建10個不同的財政年度對象並將其添加到列表或

var currentYear = DateTime.Now.Year + (DateTime.Now.Month < 7 ? 0 : 1); 
var earliestYear = 2005; 

for (int i = earliestYear; i <= currentYear; i++) { 
    //Instantiate FinancialData here..... 
    financialDataItem.FinancialYear = (i-1) + " - " + i 
} 

謝謝!

+2

Mmh ...什麼是你的GetHashCode實現中的「faewfeawfewa」?無論如何,returing obj.GetHashCode意味着你正在比較對象引用而不是值... – digEmAll 2014-08-31 12:07:44

+0

告訴我們如何創建allFinancialYearsData。 – 2014-08-31 12:10:41

+0

fawefeawfewa可能意味着FinancialData – 2014-08-31 12:12:13

回答

1

您必須執行組連接。在下面的代碼片段中,allRecords爲「2005 - 2006」到「2014 - 2015」創建虛擬FinancialData。

var allRecords = Enumerable.Range(0, 10).Select(x => new FinancialData { FinancialYear = string.Format("{0} - {1}", 2005 + x, 2005 + x + 1) }); 
var myRecords = new[] { new FinancialData { FinancialYear = "2012 - 2013", GrossEx = 1, GrossInc = 1, GST = 1 }, new FinancialData { FinancialYear = "2013 - 2014", GrossEx = 1, GrossInc = 1, GST = 1 } }; 
var result = allRecords.GroupJoin(myRecords 
       , x => x.FinancialYear, y => y.FinancialYear, (x, y) => y.FirstOrDefault(u => u.FinancialYear == x.FinancialYear) ?? x);