LINQ to SQL条件where子句
本文关键字:where 子句 条件 SQL to LINQ | 更新日期: 2023-09-27 18:01:37
我有以下控制器代码,它返回一个Json列表对象到我的视图,绘制一个饼状图。
有4个输入参数,我让它与其中3个一起工作。
但是,第一个名为'SiteTypeId'的参数需要包含在where中。
我的问题是如何将其整齐地包含在代码中,我想避免重写函数。
所需的附加逻辑为:
- 如果
SiteTypeId = -1
(那么这意味着显示所有,所以没有任何改变) - 如果
SiteTypeId = 0
(则需要添加i.SiteTypeId == 0
) - 如果
SiteTypeId = 1
(则需要添加i.SiteTypeId == 1
)
如果上面的2和3是所有需要的,我想这将是容易的。我在想一定有一个简洁的表达式,或者一个简洁的方法,把LINQ分成两个,也许有一个条件。
我是新来的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);
}
听起来你可以使用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)