2011-07-11 28 views
1

円グラフを描画するビューにJsonリストオブジェクトを返す次のコントローラコードがあります。LINQ to SQL条件式where節

4つの入力パラメータがあり、それらのうち3つで作業しています。

ただし、「SiteTypeId」と題されたfistパラメータは、どこに含まれる必要があります。

私の問題は、このコードをきれいにコードに組み込む方法です。私は関数のオーバーライドを避けたいと思います。

必要な追加のロジックは次のとおりです。

  1. SiteTypeId = -1場合(これがすべてのように何も変更する必要はありません示し意味)
  2. SiteTypeId = 0あれば(そしてi.SiteTypeId == 0ニーズ追加する)
  3. SiteTypeId = 1場合( i.SiteTypeId == 1を追加する必要があります)

上記の2と3がすべて必要な場合uldは簡単だと思います。おそらくLINQを2つの状態に分割するためのきちんとした表現でなければならないと思います。

私は、LINQに新たなんだ - 誰も私に助言することができ、ここで私は変更する必要があり、コントローラのコードは次のとおりです。

public JsonResult GetChartData_IncidentsBySiteStatus(string SiteTypeId, string searchTextSite, string StartDate, string EndDate) 
    { 
     if (searchTextSite == null) 
      searchTextSite = ""; 

     DateTime startDate = DateTime.Parse(StartDate); 
     DateTime endDate = DateTime.Parse(EndDate); 

     var qry = from s in _db.Sites 
        join i in _db.Incidents on s.SiteId equals i.SiteId 
        where s.SiteDescription.Contains(searchTextSite) 
        && (i.Entered >= startDate && i.Entered <= endDate) 
        group s by s.SiteStatus.SiteStatusDescription + "[" + s.SiteTypeId.ToString() + "]" 
         into grp 
         select new 
         { 
          Site = grp.Key, 
          Count = grp.Count() 
         }; 

     return Json(qry.ToList() , JsonRequestBehavior.AllowGet); 
    } 

答えて

1

はこれを試してください:あなたはLINQKitを使用することができますように

public JsonResult GetChartData_IncidentsBySiteStatus(string SiteTypeId, string searchTextSite, string StartDate, string EndDate) 
{ 
     if (searchTextSite == null) 
       searchTextSite = ""; 

     DateTime startDate = DateTime.Parse(StartDate); 
     DateTime endDate = DateTime.Parse(EndDate); 

     var incidentsQry = _db.Incidents; 
     if(SiteTypeId > -1) 
     { 
      incidentsQry = incidentsQry.Where(a=>a.SiteTypeId == SiteTypeId); 
     } 

     var qry = from s in _db.Sites 
          join i in incidentsQry on s.SiteId equals i.SiteId 
          where s.SiteDescription.Contains(searchTextSite) 
           && (i.Entered >= startDate && i.Entered <= endDate) 
          group s by s.SiteStatus.SiteStatusDescription + "[" + s.SiteTypeId.ToString() + "]" 
            into grp 
            select new 
            { 
              Site = grp.Key, 
              Count = grp.Count() 
            }; 

     return Json(qry.ToList() , JsonRequestBehavior.AllowGet); 
} 
2

は、サウンドとそのPredicateBuilder。これを使用して、動的条件付きWHERE句を作成します。 LinqPadでも使われていて、無料です。

+1

1に以下を追加し、私はPredicateBuilderの周りに基づいて動的なExpressionFilterを構築することになりました。それは美味しいテクニックです。 :) –

0

単に柔軟なフィルタリングUIを電源にあなたのwhere句

(SiteTypeId == -1 || i.SiteTypeId == SiteTypeId)