2013-10-02 42 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; 
}