如何根据是否提供值来编写Linq

时间:2011-11-17 18:47:42

标签: c# linq entity-framework-4

我正在尝试编写带有一些可选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子句。

由于 埃里克

4 个答案:

答案 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)