0

LINQ でラムダ式を使用しています。条件が満たされている場合は、すべての結果を取得する必要があります。

//コード

 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 条件に一致するすべての結果セットを返すか、TransporterName に従って返す必要があります。

どうすればこれを達成できますか?

4

5 に答える 5

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);

transporter 名が「ALL」の場合、名前 OR 条件が与えられtrueCustomerTransNameチェックされません。

于 2013-10-02T11:07:11.807 に答える
2

純粋な論理で。

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

または、コードの繰り返しが少ない場合:

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);
于 2013-10-02T11:07:26.723 に答える
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);
于 2013-10-02T11:08:44.453 に答える
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();
}
于 2013-10-02T11:10:56.727 に答える
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;
}
于 2013-10-02T11:13:40.290 に答える