C# LINQ到SQL条件where子句
我有以下控制器代码,它将Json列表对象返回到绘制饼图的视图中 有4个输入参数,我有它与其中3个工作 但是,标题为“SiteTypeId”的第一个参数需要包含在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都
SiteTypeId=-1
(那么这意味着全部显示,因此不需要更改任何内容)SiteTypeId=0
(则需要添加i.SiteTypeId==0
)SiteTypeId=1
(则需要添加i.SiteTypeId==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 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;这是一项非常好的技术。:)