2012-11-12 119 views
1

根據linq查詢中檢索到的其他幾個「列」設置狀態的最佳做法是什麼?linq條件查詢

var result = (from q in query 
       select new Item 
         { 
          ApprovedDate = q.ApprovedDate, 
          CreatedDate = q.CreatedDate, 
          DeclinedDate = q.DeclinedDate, 
          Status = 0 
         }); 

我想狀態設置爲0,1,2

(ApprovedDate == null and DeclinedDate == null) --> 0 
(ApprovedDate != null and DeclinedDate == null) --> 1 
(DeclinedDate != null) --> 3 

所以,或許是這樣的:

var result = (from q in query 
       select new Item 
         { 
          ApprovedDate = q.ApprovedDate, 
          CreatedDate = q.CreatedDate, 
          DeclinedDate = q.DeclinedDate, 
          Status = (q.CreatedDate == null && q.DeclinedDate == null) ? 0 : (q.ApprovedDate != null && q.DeclinedDate == null) ? 1 : 2 
         }); 

我可能會添加更多的狀態組合,所以我應該嘗試在linq select query中執行此操作,在我的存儲庫對象中。或者稍後在控制器中,我將執行.ToList()然後foreach列表以設置正確的狀態代碼?

甚至有3個以上的狀態碼,linq查詢變得很難讀取。

回答

2

移動狀態計算到Item類怎麼樣?如果狀態屬性依賴於其他屬性值,那麼它肯定計算性能:

var result = from q in query 
      select new Item 
         { 
          ApprovedDate = q.ApprovedDate, 
          CreatedDate = q.CreatedDate, 
          DeclinedDate = q.DeclinedDate 
         }); 

而且

public class Item 
{ 
    // other properties 

    public int Status 
    { 
     get 
     { 
      if (ApprovedDate == null and DeclinedDate == null) 
       return 0; 
      if (ApprovedDate != null and DeclinedDate == null) 
       return 1; 
      if (DeclinedDate != null) 
       return 3; 
      // etc 
     } 
    } 
} 

其實我認爲這是最好的選擇,因爲在這種情況下,狀態和計算邏輯將接近所需的數據。如果(出於某種原因),你不能使用這種方法,然後將設置狀態到本地項目集合:

var items = result.ToList().ForEach(i => i.Status = CalculateStatus(i)); 
+0

謝謝。我同意100%與你。這當然是最明顯和最好的解決方案。再次感謝..!!現在爲什麼5分鐘前我的腦海裏沒有這個:) – Kman

+0

@Kman我喜歡把邏輯和數據放在一起:) –

0

也許包裹所有函數中的做LINQ這樣

var result = (from q in query sele q).AsEnumerable() 
             .Select(x => new Item() 
             { 
              ApprovedDate = x.ApprovedDate, 
              CreatedDate = x.CreatedDate, 
              DeclinedDate = x.DeclinedDate, 
              Status = MyStatusFunction(x.CreatedDate,q.DeclinedDate) 
             }); 


public int MyStatusFunction(DateTime ApprovedDate , Datetime DeclinedDate) 
{ 
    if (ApprovedDate == null and DeclinedDate == null) return 0; 
    else if(ApprovedDate != null and DeclinedDate == null) return 1; 
    else if (DeclinedDate != null) return 3; 
}