Linq условия для вложенного объекта
От: detox Россия  
Дата: 02.02.11 16:33
Оценка:
Доброго...

Был запрос, который корректно работал возращая корневые и в них дочерние элементы:

this.ObjectContext.Parent.Include("Childs").Where(p => p.IsHidden == false)


У дочерних элементов также появилось свойство IsHidden и их также необходимо скрывать
Первое что попробывал сделать вот так:

this.ObjectContext.Parent.Include("Childs").Where(p => p.IsHidden == false).Where(c => c.IsHidden == false)


Ну это конечно не сработало, что и понятно, так как имеем вот такой SQL:

...
    FROM  [dbo].[Parent] AS [Extent1]
    LEFT OUTER JOIN [dbo].[Childs] AS [Extent2] ON [Parent].[ParentID] = [Child].[ParentID]
    WHERE (0 = [Extent1].[IsHidden]) AND (0 = [Extent1].[IsHidden])
...


Ну а хотелось бы конечно вот такой запрос иметь:

...
    FROM  [dbo].[Parent] AS [Extent1]
    LEFT OUTER JOIN [dbo].[Childs] AS [Extent2] ON [Parent].[ParentID] = [Child].[ParentID] AND (0 = [Extent2].[IsHidden])
    WHERE (0 = [Extent1].[IsHidden]) 
...


Это возможно?
Re: Linq условия для вложенного объекта
От: mrjeka Россия  
Дата: 02.02.11 18:30
Оценка:
Здравствуйте, detox, Вы писали:

D>Это возможно?

Попробуйте такое условие.

this.ObjectContext.Parent.Include("Childs").Where(p => p.IsHidden == false && p.Child.IsHidden == false);
Re[2]: Linq условия для вложенного объекта
От: detox Россия  
Дата: 02.02.11 18:36
Оценка:
Здравствуйте, mrjeka, Вы писали:

M>Здравствуйте, detox, Вы писали:


D>>Это возможно?

M>Попробуйте такое условие.
M>

M>this.ObjectContext.Parent.Include("Childs").Where(p => p.IsHidden == false && p.Child.IsHidden == false);
M>



В этом и дело, что у объекта Parent нет свойства Child у него есть только массив Childs.
Re[3]: Linq условия для вложенного объекта
От: Аноним  
Дата: 02.02.11 19:02
Оценка:
Здравствуйте, detox, Вы писали:

D>Здравствуйте, mrjeka, Вы писали:


M>>Здравствуйте, detox, Вы писали:


D>>>Это возможно?

M>>Попробуйте такое условие.
M>>

M>>this.ObjectContext.Parent.Include("Childs").Where(p => p.IsHidden == false && p.Child.IsHidden == false);
M>>



D>В этом и дело, что у объекта Parent нет свойства Child у него есть только массив Childs.



this.ObjectContext.Parent.Include("Childs").Where(p => p.IsHidden == false && p.Childs.All(c => c.IsHidden == false));
Re[4]: Linq условия для вложенного объекта
От: detox Россия  
Дата: 03.02.11 18:56
Оценка:
Здравствуйте, Аноним, Вы писали:

А>

А>this.ObjectContext.Parent.Include("Childs").Where(p => p.IsHidden == false && p.Childs.All(c => c.IsHidden == false));
А>


Это интересно, но в итоге вот такой SQL:

    FROM  [dbo].[Parent] AS [Extent1]
    LEFT OUTER JOIN [dbo].[Childs] AS [Extent2] ON [Extent1].[ParentID] = [Extent2].[ParentID]
    WHERE (0 = [Extent1].[IsHidden]) 
    AND (NOT EXISTS (
        SELECT 1 AS [C1]
        FROM [dbo].[Childs] AS [Extent3]
        WHERE ([Extent1].[ParentID] = [Extent3].[ParentID]) 
        AND ((cast(0 as bit) <> [Extent3].[IsHidden]) 
        OR (CASE WHEN (0 = [Extent3].[IsHidden]) 
        THEN cast(1 as bit) 
        WHEN (cast(0 as bit) <> [Extent3].[IsHidden]) 
        THEN cast(0 as bit) END IS NULL))))


И теперь не выводятся все Parent у которых хотя бы один из Child имеет свойство IsHidden = false
Re: Linq условия для вложенного объекта
От: MozgC США http://nightcoder.livejournal.com
Дата: 03.02.11 19:00
Оценка: +1
Простите за придирки, но в английском нет слова childs, есть children.
Re: Linq условия для вложенного объекта
От: HowardLovekraft  
Дата: 03.02.11 19:46
Оценка:
Здравствуйте, detox, Вы писали:

D>Был запрос, который корректно работал возращая корневые и в них дочерние элементы:

D>У дочерних элементов также появилось свойство IsHidden и их также необходимо скрывать
How to do a Conditional Include.
Но могут быть подводные камни (была тема здесь, поищите).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.