我正在尝试编写带有一些可选where子句的LINQ语句。这是为了搜索。用户可以选择特定站点来搜索或搜索所有站点:
var query =
_db.STEWARDSHIP
.OrderBy(r => r.SITE.SITE_NAME)
.Where(r => r.SITE_ID == SiteId)
.Where(r => r.VISIT_TYPE_VAL.VISIT_TYPE_ID == VisitTypeId)
.Select(r => new
{
id = r.STEWARDSHIP_ID,
name = r.SITE.SITE_NAME,
visit_type = r.VISIT_TYPE_VAL.VISIT_TYPE_DESC,
visit_date = r.VISIT_DATE
});
return query;
因此,当方法获得SiteId = 14时,没问题。但是,当它获得SiteId = null时,则不应考虑where子句。
由于 埃里克
答案 0 :(得分:5)
这很简单:
var query = _db.STEWARDSHIP.OrderBy(r => r.SITE.SITE_NAME);
if (SiteId != null)
{
query = query.Where(r => r.SITE_ID == SiteId);
}
query = query.Where(r => r.SITE.SITE_TYPE_VAL.SITE_TYPE_ID == SiteTypeId)
.Select(r => new
{
id = r.STEWARDSHIP_ID,
name = r.SITE.SITE_NAME,
visit_type = r.VISIT_TYPE_VAL.VISIT_TYPE_DESC,
visit_date = r.VISIT_DATE
});
return query;
这很有效,因为查询很好地构成了 - 它们实际上只代表查询;只有当你尝试从中获取查询实际执行的数据时才会这样做。
答案 1 :(得分:1)
你不能只将where子句编辑为
.Where(r=>SiteId == null || r.SiteId == SiteId)
答案 2 :(得分:1)
我从TSQL窃取了一个技巧。只需检查空值。
...
.Where(r => SiteID == null || r.SITE_ID == SiteID)
...
SQL示例如下:
WHERE (SITE_ID = @given OR @given IS NULL) --return matches or all
虽然如果该值是可变的并且您想要构建查询时的值,请尝试以下方法:
var localSiteID = SiteID;
...
.Where(r => localSiteID == null || r.SITE_ID == SiteID)
...
答案 3 :(得分:1)
你可以在一个语句中使用where子句..就像这个..
.Where(r => SiteID == null || r.SITE_ID == SiteID)