2015-04-28 127 views
1

我有一個方法,有四個參數,我用來過濾我的數據,有時4個參數填充,有時只有三個或兩個或一個被填充,所以我正在尋找一種方法來採取只有必要的參數值。例如,如果用戶只輸入一個像startDate這樣的參數,我想用該日期恢復所有數據,而不使用其他參數,如null,但不應考慮這些參數,我的方法將搜索具有正確StartDate的數據和其他參數null我不想這樣做方法與可選參數

internal static List<Inconsistence> FilterList(DateTime? StartDate, DateTime? EnDate, decimal? State, decimal? Type) 
{ 
    using (Model m = new Model()) 
    { 
     return m.DBContext 
       .InconsistencyDebtors 
       .Join(m.DBContext.Inconsistencies, 
         u => u.InconsistencyId, 
         uir => uir.InconsistencyId, 
         (u, uir) => new { u, uir }) 
       .Join(m.DBContext.InconsistencyDebtorDocuments, 
         r => r.uir.InconsistencyId, 
         ro => ro.InconsistencyId, 
         (r, ro) => new { r, ro }) 
       .Where(g => 
         g.r.uir.InconsistencyStateId == State && 
         g.r.uir.InconsistencyTypeId == Type && 
         g.r.uir.InsDate >= StartDate && 
         EnDate >= g.r.uir.InsDate) 
       .Select(g => new Inconsistence() 
        { 
         ParticipantCode = g.r.u.ParticipantCode, 
         DebtorId = g.ro.DebtorId, 
         InconsistencyTypeId = g.r.uir.InconsistencyTypeId, 
         InconsistencyStateId = g.r.uir.InconsistencyStateId, 
         DateInconsistence = g.r.uir.InsDate 
        }) 
       .ToList(); 
    } 
} 
+0

我建議你要學習一些關於重載,http://csharpindepth.com/Articles/General/Overloading.aspx。 –

+0

你的問題不清楚。你不想做什麼? –

回答

0

我想你可以寫你的where子句是這樣的:

.Where(g => 
    (State.HasValue.Equals(false) || g => g.r.uir.InconsistencyStateId == State) && 
    (Type.HasValue.Equals(false) || g.r.uir.InconsistencyTypeId == Type) && 
    (StartDate.HasValue.Equals(false) || g.r.uir.InsDate >= StartDate) && 
    (EnDate.HasValue.Equals(false) || EnDate >= g.r.uir.InsDate) 
) 

我沒有測試它,但它應該工作。

+0

它一點兒也不認識摹 – khadi8

+0

我錯過了'G =>',編輯 – Daniele

+0

謝謝它的工作 – khadi8

3

選項1:過載。 創建4個方法,每個方法都有一個不同的簽名,這些簽名稱爲「主要」方法,例如,全參數的方法。呼叫隨同一些默認參數一起進行。

internal static List<Inconsistence> FilterList(DateTime? StartDate, DateTime? EnDate, decimal? State) 
{ 
    return FilterList(StartDate, EnDate, State, null); // Call overloaded method with Type = null 
} 

internal static List<Inconsistence> FilterList(DateTime? StartDate, DateTime? EnDate, decimal? State, decimal? Type) 

選項2:默認值 你可以給你的方法,參數的默認值。只有最後一個參數可以有默認值。看起來像這樣

internal static List<Inconsistence> FilterList(DateTime? StartDate, DateTime? EnDate, decimal? State, decimal? Type = null) 

這,Type-參數將是可選的。未在通話中指定時,它將具有指定的默認值。在這種情況下,它是null

0

你可以讓你的參數可選:MSDN

internal static List<Inconsistence> FilterList(DateTime? StartDate, DateTime? EnDate = null, decimal? State = null, decimal? Type = null) 
0

params能爲你做的,但你將需要向下投射的值object

定義功能

internal static List<Inconsistence> FilterList(params object[] list) 
{ 
    //check the size of `list` object and cast the values 
    (DateTime)list[0] 
    (double)list[1] 
} 

和通話將

FilterList(DateTime.Now); 
FilterList(DateTime.Now, 1.0); 
+0

不利的一面,你有拳擊開銷在這裏,這就是爲什麼我會傾向於使用其他的解決方案之一。 –