[英]LINQ to SQL Conditional where clause
我有以下 controller 代码返回一个 Json 列表 object 到我绘制饼图的视图。
有 4 个输入参数,我可以使用其中的 3 个。
但是,第一个名为“SiteTypeId”的参数需要包含在 where 中。
我的问题是如何在代码中巧妙地包含它,我想避免覆盖 function。
所需的附加逻辑是:
SiteTypeId = -1
(这意味着全部显示,因此无需更改任何内容)SiteTypeId = 0
(则需要添加i.SiteTypeId == 0
)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.