2011-11-17 2 views
0

일부 선택적 where 절을 사용하여 LINQ 문을 작성하려고합니다. 이것은 검색을위한 것입니다. 사용자가 검색하거나 모든 사이트에 대해 검색 할 특정 사이트를 선택할 수 있습니다값이 제공되는지 여부에 따라 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 절을 고려해서는 안됩니다.

감사 에릭

답변

1

방금 ​​편집 할 수있는 위치를 쉽게

.Where(r=>SiteId == null || r.SiteId == SiteId) 
+0

SITE_ID가 null 인 레코드가 없으므로 이것이 가능하지 않다고 생각합니다. 따라서 이것은 결코 결과를 반환하지 않습니다. –

+0

@ Eric : null에 대해 SITE_ID를 확인하지 않습니다. 주어진'SiteID' 값을 null로 검사합니다. –

+0

@AustinSalonen, null 인 경우 WHERE 절은 무시됩니까? –

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; 

- 및 그들은 실제로 쿼리만을 나타냅니다. 쿼리가 실제로 실행된다는 데이터를 가져올 때만 가능합니다.

+0

표현식 트리를 편집하기위한 확장 방법을 만드는 경우가 아니라면 OR 구성의 시나리오와 잘 어울리지 않습니다. – Jeff

+0

@ JeffN825 : 음, 그걸 위해서'PredicateBuilder'를 사용할 수 있습니다 -하지만이 경우에는 불필요합니다. –

1

나는 TSQL에서 속임수를 훔치고있다. null 값도 확인하십시오.

... 
.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) 
... 
1

당신은 하나의 문장에서 where 절을 사용할 수 있습니다 ..이게 .. ..

.Where(r => SiteID == null || r.SITE_ID == SiteID) 
관련 문제