Как написать Linq в зависимости от того, указано значение или нет - PullRequest
0 голосов
/ 17 ноября 2011

Я пытаюсь написать оператор LINQ с некоторыми дополнительными предложениями where. Это для поиска. Пользователь может выбрать определенный сайт для поиска или поиска по всем сайтам:

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 не должно учитываться.

Спасибо Eric

Ответы [ 4 ]

5 голосов
/ 17 ноября 2011

Это просто:

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 голос
/ 17 ноября 2011

вы можете использовать выражение where в одном выражении .. как это ..

  .Where(r => SiteID == null || r.SITE_ID == SiteID) 
1 голос
/ 17 ноября 2011

Я краду уловку из 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)
...
1 голос
/ 17 ноября 2011

Разве вы не можете просто отредактировать предложение where к чему-то вроде

 .Where(r=>SiteId == null || r.SiteId == SiteId)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...