LINQ to SQL Conditional where子句

时间:2011-07-11 03:04:54

标签: c# asp.net-mvc linq

我有以下控制器代码,它将Json列表对象返回到我的视图中绘制饼图。

有4个输入参数,我可以使用它们中的3个。

但是,名为“SiteTypeId”的第一个参数需要包含在where。

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

所需的额外逻辑是:

  1. 如果SiteTypeId = -1(那么这意味着显示所有内容,以便不做任何改动)
  2. 如果SiteTypeId = 0(然后需要添加i.SiteTypeId == 0
  3. 如果SiteTypeId = 1(然后需要添加i.SiteTypeId == 1
  4. 如果上面的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);
        }
    

3 个答案:

答案 0 :(得分:2)

听起来你可以使用LINQKit及其PredicateBuilder。您可以使用它来构建动态条件WHERE子句。它也用在LinqPad中,它是免费的。

答案 1 :(得分: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 :(得分:0)

只需将以下内容添加到where子句

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