我有以下控制器代码,它将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);
}
答案 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)