2013-10-02 48 views
0

我在LINQ中使用lambda表達式,當必須滿足條件時纔會獲得所有結果,如果不是,應該過濾。返回列表中的所有<T> lambda表達式

//代碼

List<Dispatch> objDispatch = (List<Dispatch>)Session["Data"]; 
objDispatch = objDispatch.FindAll(dispatch => dispatch.CustomerTransName == ddlTransporterName.SelectedItem.Text && dispatch.InvoiceDate.Date >= Convert.ToDateTime(FromDate).Date && dispatch.InvoiceDate.Date <= Convert.ToDateTime(ToDate).Date); 

在上面的代碼即時過濾結果與在該第一條件我需要一個幫助在一些條件設定。

如果傳輸器名稱是'ALL',它應該返回與Date條件匹配的所有結果集,否則它應該根據傳輸器名稱返回。

我該如何做到這一點?

+4

只是快速注意 - 你在這裏並沒有使用LINQ。 'List .FindAll'是.NET 2.0中'List '的一部分。 –

+0

@JonSkeet:更新。 – iamCR

+0

因此,如果我理解正確,如果下拉列表中選定的項目是「ALL」,那麼您希望列表返回兩個日期之間的日期的所有對象,否則它應該過濾名稱以及日期?如果是這種情況,一個簡單的'if'就足夠了。 – Sean

回答

2

純邏輯。

if(ddlTransporterName.SelectedItem.Text == "ALL") { 
    //return all 
} else { 
    //Do your filter logic 
} 

或者,用更少的代碼repitive:

objDispatch = objDispatch.FindAll(
    dispatch => (ddlTransporterName.SelectedItem.Text == "ALL" || dispatch.CustomerTransName == ddlTransporterName.SelectedItem.Text) 
    && dispatch.InvoiceDate.Date >= Convert.ToDateTime(FromDate).Date 
    && dispatch.InvoiceDate.Date <= Convert.ToDateTime(ToDate).Date); 
+0

錯誤情況'派送。CustomerTransName ==「ALL」,將檢查名稱。 OP想跳過檢查名稱,如果轉運人名稱是'ALL' –

+0

哎呀,謝謝,複製粘貼了錯誤的屬性:) –

2
string name = ddlTransporterName.SelectedItem.Text; 
objDispatch = objDispatch.FindAll(dispatch => 
    (name == "ALL" || dispatch.CustomerTransName == name) 
    && dispatch.InvoiceDate.Date >= Convert.ToDateTime(FromDate).Date 
    && dispatch.InvoiceDate.Date <= Convert.ToDateTime(ToDate).Date); 

如果轉運的名字是「ALL」,那麼名稱或條件會給trueCustomerTransName將不檢查。

2

如果你想這是LINQ,那麼你需要實際使用LINQ方法,例如使用Where。此外,如果您的日期轉換不是特定於該行,您應該在外面進行日期轉換,否則它們會每次轉換。不僅如此,它使更多可讀的代碼......

var selectedTransporter = ddlTransporterName.SelectedItem.Text; 
var fromDate = Convert.ToDateTime(FromDate).Date; 
var toDate = Convert.ToDateTime(ToDate).Date; 
var query = objDispatch.Where(x => (selectedTransporter == "All" || x.CustomerTransName == selectedTransporter) && x.InvoiceDate.Date >= fromDate && x.InvoiceDate.Date <= toDate); 
0

我認爲這應該足夠了:

List<Dispatch> objDispatch = (List<Dispatch>)Session["Data"]; 

List<Dispatch> filteredDispatches = objDispatch.Where(dispatch => dispatch.InvoiceDate.Date >= Convert.ToDateTime(FromDate).Date && dispatch.InvoiceDate.Date <= Convert.ToDateTime(ToDate).Date).ToList(); 

if (ddlTransporterName.SelectedItem.Text != "ALL") 
{ 
    filteredDispatches = filteredDispatches.Where(dispatch => dispatch.CustomerTransName == ddlTransporterName.SelectedItem.Text).ToList(); 
} 
0

我覺得這樣的事情應該工作:

List<Dispatch> objDispatch = (List<Dispatch>)Session["Data"]; 

var _fromDate = Convert.ToDateTime(FromDate); 
var _toDate = Convert.ToDateTime(ToDate); 

objDispatch = objDispatch 
    .FindAll(dispatch => Selector(
     dispatch, ddlTransporterName.SelectedItem.Text, _fromDate, _toDate)); 

static bool Selector(
    Dispatch dispatch, string name, DateTime fromDate, DateTime toDate) 
{ 
    if (dispatch.CustomerTransName == "ALL") 
    { 
     return dispatch.InvoiceDate.Date >= fromDate.Date 
      && dispatch.InvoiceDate.Date <= toDate.Date; 
    } 

    return dispatch.CustomerTransName == name; 
}