2016-02-16 1 views
1

Я использую Linq для извлечения данных из контекста. Я пытаюсь получить только родительские CategoryAttributeItemDescriptions элементов, у которых нет внука AttributeItems с внутренним именем, содержащим слово «Range -» Код ниже, где я нахожусь.Выберите только те родители, в которых ни одно из имен детей не содержит определенную строку

var query = from caid in context.CategoryAttributeItemDescriptions 
        join cai in context.CategoryAttributeItems on caid.Id equals cai.CategoryAttributeItemDescriptionsId 
        join ai in context.AttributeItems on cai.AttributeId equals ai.Id 
        where caid.CategoryAttributeItems.Any(c => !c.AttributeItem.InternalName.Contains("Range -")) && caid.CategoryId ==element.Id 
        select caid; 

Проблема в том, что она по-прежнему возвращает родителей, которые имеют отношение к внукам с этим внутренним именем. Есть идеи? Thanks

+0

попытка изменения ИНЕКЕ «где caid.CategoryAttributeItems.Any (с =>! C.AttributeItem.InternalName.Contains («Range -»)) && caid.CategoryId == element.Id ' – uk2k05

+0

в основном добавить восклицательный знак перед c.AttributeIte .... это переводится как' Not ' – uk2k05

+0

Возможно, я читаю это неправильно, но не вы нажимаете FOR match в предикате Any(), а не exclusi нг ?? –

ответ

0

Звучит как неправильная логика.

Это

caid.CategoryAttributeItems.Any(c => !c.AttributeItem.InternalName.Contains("Range -")) 

согласно вашему требованию должны быть

!caid.CategoryAttributeItems.Any(c => c.AttributeItem.InternalName.Contains("Range -")) 
^       ^  ^
do not      have  with an internal name containing the word "Range -" 
+0

Спасибо за ответ! Однако проблема заключается в том, что если один из внуков содержит имя «Range -», то родитель не имеет дисконтирования и по-прежнему добавляется к запросу. Я хочу полностью игнорировать родителя, если у какого-либо из внуков есть это имя. –

+0

Я не анализировал весь запрос, но теперь я вижу, что 'joins' являются избыточными и умножают набор результатов, поэтому вам лучше их удалить. Хотя это еще одна проблема. Под «родителем» вы подразумеваете «caid» и внуки caid.CategoryAttributeItems', правильно? Вы уверены, что применили именно это предложение в ответ? '! Any (Contains())' должен делать именно то, что вы хотите. –

+0

caid действительно является родителем, атрибутом являются внуки. Я заметил, что результаты были дублирования, поэтому использовал Distinct. Однако на данный момент слишком поздно, поскольку добавлены атрибуты с «Range». –