2016-09-22 21 views
1

私は、パフォーマンスを向上させるためにデータを提供するためにサーバー側の処理を使用しているので、大量のデータを含むいくつかのデータセットを持っています。一般的にこれらは絶対にうまく動作します。ただし、テーブルをフィルタリングしようとすると問題が発生します。それは私のLINQ声明のwhere句を尊重するように見えないし、なぜ私は紛失している。JQuery Datatablesサーバー側の処理とフィルター

私のDataTable initisalisationの例の一つは次のようになります。

$('#link-list').dataTable({ 
     'bServerSide': true, 
     'sAjaxSource': '@Url.Action("LazyLoadComms", "Communication")', 
     'bProcessing': true, 
     async: false, 
     'aoColumns': [ 
      { 
       'mDataProp':'Id' 
      }, 
      { 
       'mDataProp': 'Customer' 
      }, 
      { 
       'mDataProp': 'Receiver' 
      }, 
      { 
       'mDataProp': 'PartNo' 
      }, 
      { 
       'mDataProp': 'DateOpened' 
      } 
     ], 
     bAutoWidth: false, 
     bLengthChange: false, 
     pageLength: 10, 
     'order': [[4, 'desc']] 
    }); 

、次のようにサーバー側の方法は次のとおりです。

public ActionResult LazyLoadComms(JqueryDataTableParams param) 
    { 
     var communications = _uow.CommunicationService.Get().ToList(); 

     IEnumerable<Communication> filteredComms; 
     if (!string.IsNullOrEmpty(param.sSearch)) 
     { 
      filteredComms = communications.Where(c => !string.IsNullOrEmpty(c.Customer.Name) ? c.Customer.Name.ToLower().Contains(param.sSearch.ToLower()) : false 
                || !string.IsNullOrEmpty(c.Receiver) ? c.Receiver.ToLower().Contains(param.sSearch.ToLower()) : false 
                || !string.IsNullOrEmpty(c.PartNo) ? c.PartNo.ToLower().Contains(param.sSearch.ToLower()) : false); 
     } 
     else 
     { 
      filteredComms = communications; 
     } 
     var sortColumnIndex = Convert.ToInt32(Request["iSortCol_0"]); 

     Func<Communication, string> orderingFunction = (c => sortColumnIndex == 0 ? c.CommunicationId.ToString() : 
                   sortColumnIndex == 1 ? c.Customer.Name : 
                   sortColumnIndex == 2 ? c.Receiver : 
                   sortColumnIndex == 3 ? c.PartNo : 
                   c.DateOpened.ToLongDateString()); 

     var sortDirection = Request["sSortDir_0"]; 
     if (sortDirection == "asc") 
      filteredComms = filteredComms.OrderBy(orderingFunction); 
     else 
      filteredComms = filteredComms.OrderByDescending(orderingFunction); 

     var displayedComms = filteredComms 
           .Skip(param.iDisplayStart) 
           .Take(param.iDisplayLength) 
           .Select(c => new 
           { 
            Id = c.CommunicationId, 
            Customer = c.Customer.Name, 
            Receiver = c.Receiver, 
            PartNo = c.PartNo, 
            DateOpened = c.DateOpened.ToShortDateString() + " " + c.DateOpened.ToShortTimeString() 
           }); 

     var json = Json(new 
     { 
      sEcho = param.sEcho, 
      iTotalRecords = communications.Count(), 
      iTotalDisplayRecords = filteredComms.Count(), 
      aaData = displayedComms 
     }, 
          JsonRequestBehavior.AllowGet); 

     return json; 
    } 

彼らは非常に一貫していないようです。この例のように、正しいパーツ番号を返すことはなく、入力に一致する他の列も返すかどうかはオンとオフです。

入力は常にスペースを含まない1つの単語で、小文字に変換されるため、一致する必要がありますが正しく返されません。

ご協力いただきまして誠にありがとうございます。

多くのありがとうございます!!!!

答えて

2

以下のコードを置き換えてください。これはスピードの問題かもしれません。何かエラーがあった場合は共有してください:

filteredComms = communications.Where(c => (!string.IsNullOrEmpty(c.Customer.Name) && c.Customer.Name.ToLower().Contains(param.sSearch.ToLower())) 
    || (!string.IsNullOrEmpty(c.Receiver) && c.Receiver.ToLower().Contains(param.sSearch.ToLower())) 
    || (!string.IsNullOrEmpty(c.PartNo) && c.PartNo.ToLower().Contains(param.sSearch.ToLower()))); 
+0

このコードは、私が修正する必要がある問題です。フィルタリングをしないとデータが正常に返されますが、列によってフィルタリングしようとしているとき – DaRoGa

+0

@ Netの学習者が示唆したことを試しましたか? – markpsmith

+0

私はそれを取り除くことができ、それはすべてのレコードを私に返します。それはポイントではありません。それは、そのコードの列に対してimフィルタリングを行うときに、すべての列を考慮に入れていないということです。 – DaRoGa

関連する問題