2012-03-20 5 views
2

Ну, Я не уверен, что я ошибаюсь, или если ошибки обработаны linq, но следующий запрос linq возвращает то, что я НЕ хочу, если я не использую дополнительные скобки.Проблема с парсером Linq?

int? userLevel; 
Guid? supervisorId; 
List<int> levelsIds = new List<int>(); 
string hierarchyPath; 

// init the vars above 
// ... 

var qry = from f in items 
      where userLevel.HasValue 
        ? (f.IsMinLevelIdNull() || (levelsIds.Contains(f.MinLevelId))) 
        : true 
       && supervisorId.HasValue 
        ? (f.IsSupervisorIdNull() || (!f.ChildrenVisibility && (f.SupervisorId == supervisorId.Value)) 
         || (f.ChildrenVisibility && (hierarchyPath.IndexOf(f.SupervisorId.ToString()) >= 0))) 
        : true 
      select f; 

Идея заключается в том, чтобы выполнить запрос в и между двумя блоками условиями «активированы» наличием переменного «userLevel» и «SupervisorID».

Например, если оба userLevel и supervisoId равны нулю запрос становится:

var qry = from f in items 
      where true && true 
      select f; 

Ну, этот запрос работает хорошо, только если я вложить в дополнительные скобки в 2 триграфов:

var qry = from f in items 
      where (userLevel.HasValue 
         ? (f.IsMinLevelIdNull() || (levelsIds.Contains(f.MinLevelId))) 
         : true) 
       && (supervisorId.HasValue 
         ? (f.IsSupervisorIdNull() || (!f.ChildrenVisibility && (f.SupervisorId == supervisorId.Value)) 
         || (f.ChildrenVisibility && (hierarchyPath.IndexOf(f.SupervisorId.ToString()) >= 0))) 
        : true) 
      select f; 

The Вопрос в следующем: зачем нужны дополнительные скобки? Мое мнение таково, что в синтаксисе linq есть проблема.

+0

Ничего общего с LINQ. Untagging. – leppie

+0

Вопросы _is_ о LINQ, просто ответ, который нет. Повторное добавление тегов. –

ответ

2

Дополнительных скобок будет необходим, поскольку приоритет оценивается в неправильном порядке, например, ваш код будет оцениваться как следующий, потому что нет никакого перерыва между истинной & & supervisorId.HasValue ...

var qry = from f in items 
     where 

     1st: userLevel.HasValue 

      ? 

     2nd: (f.IsMinLevelIdNull() || (levelsIds.Contains(f.MinLevelId))) 

      : 

     3rd: true && supervisorId.HasValue 
       ? (f.IsSupervisorIdNull() || (!f.ChildrenVisibility && (f.SupervisorId == supervisorId.Value)) 
        || (f.ChildrenVisibility && (hierarchyPath.IndexOf(f.SupervisorId.ToString()) >= 0))) **)** 
       : true 
     select f; 
Смежные вопросы