LINQ to SQL条件where子句

本文关键字:where 子句 条件 SQL to LINQ | 更新日期: 2023-09-27 18:01:37

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

有4个输入参数,我让它与其中3个一起工作。

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

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

所需的附加逻辑为:

  1. 如果SiteTypeId = -1(那么这意味着显示所有,所以没有任何改变)
  2. 如果SiteTypeId = 0(则需要添加i.SiteTypeId == 0)
  3. 如果SiteTypeId = 1(则需要添加i.SiteTypeId == 1)

如果上面的2和3是所有需要的,我想这将是容易的。我在想一定有一个简洁的表达式,或者一个简洁的方法,把LINQ分成两个,也许有一个条件。

我是新来的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);
    }

LINQ to SQL条件where子句

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

试试这个:

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

只需在where子句中添加以下内容

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