C# LINQ到SQL条件where子句

C# LINQ到SQL条件where子句,c#,asp.net-mvc,linq,C#,Asp.net Mvc,Linq,我有以下控制器代码,它将Json列表对象返回到绘制饼图的视图中 有4个输入参数,我有它与其中3个工作 但是,标题为“SiteTypeId”的第一个参数需要包含在where中 我的问题是如何将其整齐地包含在代码中,我希望避免重写该函数 所需的附加逻辑是: 如果SiteTypeId=-1(那么这意味着全部显示,因此不需要更改任何内容) 如果SiteTypeId=0(则需要添加i.SiteTypeId==0) 如果SiteTypeId=1(则需要添加i.SiteTypeId==1) 如果上面的2和3都

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

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

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

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

所需的附加逻辑是:

  • 如果
    SiteTypeId=-1
    (那么这意味着全部显示,因此不需要更改任何内容)
  • 如果
    SiteTypeId=0
    (则需要添加
    i.SiteTypeId==0
  • 如果
    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);
        }
    
    public JsonResult GetChartData\u incidentsbysitestus(字符串SiteTypeId、字符串searchTextSite、字符串StartDate、字符串EndDate)
    {
    if(searchTextSite==null)
    searchTextSite=“”;
    DateTime startDate=DateTime.Parse(startDate);
    DateTime endDate=DateTime.Parse(endDate);
    var qry=来自_db.站点中的s
    在s.SiteId上加入i_db.incents等于i.SiteId
    其中s.SiteDescription.Contains(searchTextSite)
    &&(i.Entered>=开始日期和i.Entered尝试以下操作:

    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);
    }
    
    public JsonResult GetChartData\u incidentsbysitestus(字符串SiteTypeId、字符串searchTextSite、字符串StartDate、字符串EndDate)
    {
    if(searchTextSite==null)
    searchTextSite=“”;
    DateTime startDate=DateTime.Parse(startDate);
    DateTime endDate=DateTime.Parse(endDate);
    var incidentsQry=_db.Incidents;
    如果(SiteTypeId>-1)
    {
    incidentsQry=incidentsQry.Where(a=>a.SiteTypeId==SiteTypeId);
    }
    var qry=来自_db.站点中的s
    在s.SiteId等于i.SiteId时将i加入incidentsQry
    其中s.SiteDescription.Contains(searchTextSite)
    
    &&(i.Entered>=startDate&&i.Entered听起来你可以使用LINQKit和its。你可以用它来构建动态条件WHERE子句。它也在LinqPad中使用,而且是免费的。

    只需将以下内容添加到WHERE子句中即可

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

    +1为了支持灵活的过滤UI,我最终基于PredicateBuilder构建了一个动态ExpressionFilter;这是一项非常好的技术。:)