2012-10-18 37 views
0

我有一個實體類型,我們稱之爲交易,通過實體框架版本1.我已經添加了以下屬性創建:做一個LINQ to實體時,在實體填充屬性查詢

public partial class Transaction 
{ 
    public int CurrentMaxRevisionNumber { get; set; } 
} 

我有以下查詢:

public List<Transaction> GetTransactions(DateTime startDate, DateTime endDate) 
{ 
    var query = from t in Repository.Transaction 
     let currentMaxRevisionNumber = 
     Repository.Transaction.Where(t1 => t1.TransactionId == t.TransactionId) 
           .Max(t1 => t.RevisionNumber) 
     where t.StartDate >= startDate 
      && t.EndDate < endDate) 
    select t; 

    return query.ToList(); 
} 

的業務規則是什麼,我們試圖完成如下:
- 對原始日期交易的新紀錄應該表示它一直是一個代碼創建軟刪除d修訂號增加。
- 交易的新記錄將在新日期中創建,修訂號增加。

的問題是,確定何時將被處理的交易順序一天一時間不斷進行,交易正在從日期日期移動,有時回原來的那些過程。這可能會導致給定交易的最大修訂版本號將是特定日期的最大修訂版號,而不是交易的最大修訂版號。這就是我試圖在查詢中執行「let」的原因。

現在的問題:
- 如何填充我在部分類中使用查詢創建的CurrentMaxRevisionNumber屬性?
- 是否有可能的另一種方式,我可以做到這一點,而不必爲每個事務做一個查詢,因爲有可能在任何給定的日期是幾百?

感謝您的幫助。

+0

IMO你的模型是太混亂了。你應該完全放棄這一個,從不同的角度來處理整個事情。 – Euphoric

回答

0

所以,我想的第一件事是使用反模式選擇N + 1,這是一個可怕的解決辦法,但至少這向我們表明,通過獲取正確的數據的問題將得到解決。它是這樣的:

public List<Transaction> GetTransactions(DateTime startDate, DateTime endDate) 
{ 
    var list = (from t in Repository.Transaction 
     where t.StartDate >= startDate 
      && t.EndDate < endDate) 
    select t).ToList(); 

    foreach(var item in list) 
    { 
     item.CurrentMaxRevisionNumber = Repository.Transaction. 
             Where(t => t.TransactionId == item.TransactionId). 
             Max(t => t.RevisionNumber); 
    } 

    return list; 
} 

出於顯而易見的原因,這個解決方案是不能接受的,所以我們提出了以下幾點:

public List<Transaction> GetTransactions(DateTime startDate, DateTime endDate) 
{ 
    var query = (from t in Repository.Transaction  
     where t.StartDate >= startDate 
      && t.EndDate < endDate) 
    select new 
    { 
     OriginalTransaction = t, 
     CurrentMaxRevisionNumber = Repository.Transaction. 
             Where(t1 => t1.TransactionId == t.TransactionId). 
             Max(t1 => t1.RevisionNumber); 
    }).ToList(); 

    foreach(var item in list) 
    { 
     item.OriginalTransaction.CurrentMaxRevisionNumber = item.CurrentMaxRevisionNumber; 
    } 

    return list.Select(items => items.OriginalTransaction).ToList(); 
} 

通過使用匿名對象,我們可以得到所有我們需要的數據一個數據庫訪問,並使用循環來填充缺失的屬性。

因爲我們不得不修改數據庫中的自由和應用是比較有限的,這種解決方案被證明是最侵入性和更好的性能。