2016-02-10 3 views
0

У меня есть класс Решения:как фильтр для дополнительного поля

public class Solution{ 
    public bool? IsTemplate{get;set;} 
    public string createdBy{get;set;} 

} 

некоторые документы имеют множество IsTemplate поля для истинных или ложных, многих из них не имеют.

Как я могу получить решения, которые либо установили значение false вместе с теми, у которых нет поля вообще (устаревшие документы)?

Я попытался с помощью IsTemplate фильтровать значение null, false, null или false, но я никогда не возвращал решения, которые не имеют поля IsTemplate. Единственный способ, которым я должен работать, это следующее, но это уродливо, как черт.

using (IDocumentSession session = DocumentStoreHolder.Store.OpenSession()) 
      { 
       var ret= session.Query<Solution>().Where(x => 
       x.createdBy.Equals(owner)) //an user's solutions 
       .ToList() 
       .Where(s => s.IsTemplate == null || s.IsTemplate == false) 
       .ToList(); 
       return ret; 
      } 
+0

Пожалуйста, смотрите [ "Должны ли вопросы включают„метки“в их названиях?"] (Http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles), где консенсус «нет, они не должны»! –

+0

OK Андреас, спасибо. – pomarc

ответ

0

Вам нужно создать индекс, посмотреть на недостающем имуществе:

from x in docs.Solutions 
select new 
{ 
    IsTemplate = x.IsTemplate == true // if this is null, will return false 
} 

Тогда запрос об этом.

-1

Предполагая, что первый ToList используется потому, что IQueryable реализация этого «документа магазин» обеспечивает не поддерживает ваш запрос по какой-то причине, вы не можете сделать гораздо больше.

Я предлагаю:

  • Открытие отчета об ошибке с провайдером, чтобы реализовать требуемую функциональность или добавить его самостоятельно, если у вас есть доступ к кодовому.
  • В то же время используйте AsEnumerable вместо ToList, чтобы не буферизовать весь набор данных перед продолжением.

Предложение Where выглядит довольно простым. Если ваше приложение не имеет смысловой разницы между не присутствующим и ложным (это похоже на его описание), я бы рассмотрел отображение условия отсутствия на ложное условие и использование структуры данных назначения, которая не позволяет nullable IsTemplate.

 using (IDocumentSession session = DocumentStoreHolder.Store.OpenSession()) 
     { 
      return session.Query<Solution>() 
       .Where(x => x.createdBy.Equals(owner)) 
       .AsEnumerable() 
       .Select(s => new { 
        IsTemplate = s.IsTemplate ?? false, 
        CreatedBy = s.CreatedBy }) 
       .ToList(); 
     } 

Обратите внимание, что результирующий объект является анонимным, и мы его возвращаем; что мешает нам использовать хорошо типизированную подпись метода. Таким образом, я бы определенно определить другой Solution класс.

Вы можете видеть, что дизайн вырисовывается естественным образом: теперь у вас есть два типа Solution. Один для домена, используемый приложением, и который вообще не заботится о устаревших условиях, таких как «IsTemplate», который является нулевым (он никогда не с точки зрения приложения), а другой, который используется только для склеивания наследия условий в течение вашего переходного периода. Обязательно организуйте их и назовите их адекватно, чтобы было ясно, что используется для чего (используйте пространства имен .NET, вот что они умеют!).

+0

@ the Everyone: Пример того же решения, что и принятый ответ, он также затрагивает соответствующую проблему буферизации и добавляет объяснения (особенно в отношении следующих шагов, поскольку анонимные типы по определению не могут отображаться в sigs, что будет проблемой для OP, поскольку список возвращается). AFAICT - нисходящее движение. Ты будешь судьей. – tne

1
var ret = session.Query<Solution>() 
    .Where(x => x.createdBy.Equals(owner) 
     && (!x.IsTemplate.HasValue || x.IsTemplate.Value == false)) 
    .ToList(); 
+0

Боюсь, что это не сработает. Выбраны только документы с IsTemplate = false. – pomarc

Смежные вопросы