繁体   English   中英

LINQ 到 SQL 条件 where 子句

[英]LINQ to SQL Conditional where clause

我有以下 controller 代码返回一个 Json 列表 object 到我绘制饼图的视图。

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

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

我的问题是如何在代码中巧妙地包含它,我想避免覆盖 function。

所需的附加逻辑是:

  1. 如果SiteTypeId = -1 (这意味着全部显示,因此无需更改任何内容)
  2. 如果SiteTypeId = 0 (则需要添加i.SiteTypeId == 0
  3. 如果SiteTypeId = 1 (则需要添加i.SiteTypeId == 1

如果只需要上面的 2 和 3,我猜这很容易。 我认为这必须有一个简洁的表达方式,或者有一个巧妙的方法将 LINQ 分成 2 个可能有一个条件。

我是 LINQ 的新手-谁能告诉我,这是我需要修改的 controller 代码:

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

听起来您可以使用 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM