2011-07-11 20 views
1

我有以下控制器代码返回一个Json列表对象到我的视图,绘制一个饼图。LINQ to SQL有条件的地方从句

有4个输入参数,我有它的3个工作。

但是,标题为“SiteTypeId”的第一个参数需要包含在其中。

我的问题是如何将这个整齐地包含在代码中,我想避免重写的功能。

所需的额外的逻辑是:

  1. 如果SiteTypeId = -1(那么这意味着显示所以没有所要变更全部)
  2. 如果SiteTypeId = 0(然后需要i.SiteTypeId == 0被添加)
  3. 如果SiteTypeId = 1(那么需要添加i.SiteTypeId == 1

如果上面的2和3都是需要它的话我猜很容易。我认为必须有一个简洁的表达方式,或者将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

试试这个:

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

听起来像是你可以使用LINQKit和其PredicateBuilder。您可以使用它来构建动态条件WHERE子句。它也用于LinqPad,并且它是免费的。

+1

+1要启动一个灵活的过滤UI,我结束了构建基于周围PredicateBuilder动态ExpressionFilter;这是一种美味的技术。 :) –

0

只需添加以下到您的where子句

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