2012-09-03 65 views
1

我正在使用Simple.data,答案並不在前面提到的技術中,但有助於將問題貫穿始終。所以忽略語法等。「var」的最佳實踐(算法幫助)

我用一個簡單的查詢查詢數據庫;但基於一組條件,查詢將會改變。

因此,例如:(非常簡單化,大概5-10條件)

 var result; 

    if(LoggedAtSelected) 
    { 
     // Condition 1 - Calls Logged after a certain date 
     result = db.Jobs.FindAll(db.Jobs.Logged_At >= startDate); 
    } 
    else 
    { 
     // Condition 2 - Calls Closed after a certain date 
     result = db.Jobs.FindAll(db.Jobs.Closed_At >= startDate && dd.Jobs.Closed_At <= endDate); 
    } 

    foreach(var JobRecord in result) 
    { 
    } 

這是上面的理想代碼,但遺憾的是,這是不可能給出變種的動態結合和可變性質。這種情況的最佳做法是什麼?我唯一的想法是爲每個條件編寫一個「var result = condition ...」,並在if..else if..else中將其轉換爲全局變量,然後將其轉換爲該類型;然後在「foreach」中使用它。聽起來很多工作。有任何想法嗎?或者是它!!!?!!!

+3

'var'的實際類型是什麼?並使用它? – RvdK

+0

'var'不會使'result'動態,它仍然是靜態類型。它只是節省你寫出的類型。正如PoweRoy所說,找出你想要的類型,例如'IEnumerable '並且聲明'result'是那個類型。 –

+0

@MarkPattison - 'JobRecords'是每個項目的變量名稱... – Oded

回答

6

相反的:

var result; 

使用由db.Jobs.FindAll返回的實際類型:

IEnumerable<Job> result; 
+0

感謝Oded,只需要找出Simple.Data是否可以提供一個「靜態」類型用於IEnumerable(某處它應該知道這一點)。但我已經投了答案:) –

+0

是的,只要T中的屬性名稱大致與表中的列名相匹配,Simple.Data就會自動將FindAll的結果轉換爲IEnumerable 。 –

0

你只能使用VAR如果編譯器知道使用到底哪個類型(或如何定義新的類型)。

你的情況,你可以用類型定義它說

List<Job> result; 

或調用構造函數返回一個實例:

var result = new List<Job>; 

(當然你的查詢將返回一個IEnumarable實例,而不是我只是用List作爲例子,因爲你不能實例化一個枚舉。)

+0

不需要'new List ();',因爲變量肯定會被分配到以後。 – Oded

+0

@Oded我同意,我只是用它作爲示例代碼來展示如何告訴編譯器使用哪種類型。 –

0

就像你的if語句確定查詢的過濾器一樣而不是查詢本身,您可能需要在那裏建立一個SimpleExpression,然後運行查詢。例如。

var whereCLause; 

if(LoggedAtSelected) 
{ 
    // Condition 1 - Calls Logged after a certain date 
    whereClause = db.Jobs.Logged_At >= startDate; 
} 
else 
{ 
    // Condition 2 - Calls Closed after a certain date 
    whereClause = db.Jobs.Closed_At >= startDate && dd.Jobs.Closed_At <= endDate; 
} 

List<Job> results = db.Jobs.All.Where(whereClause); 
foreach(Job record in results) 
{ 
    ... 
}