Как расширить в Lightswitch запрос, возвращающий только листовые узлы дерева?

В Microsoft Lightswitch у меня есть таблица со ссылками на себя, подобная этой:

Courses {CourseID int, ParentID int, CourseName string}

На экране LightSwitch у меня есть раскрывающийся список, в котором должны отображаться только курсы листьев.

Я создал запрос LeafCourses и пытаюсь расширить его, чтобы он возвращал только конечные узлы, что-то вроде оператора SQL:

SELECT * FROM Courses WHERE CourseId NOT IN  
(    
SELECT ParentID FROM Courses WHERE ParentID is NOT NULL     
)

Вот что у меня есть (не работает):

    partial void LeafCourses_PreprocessQuery(string Parameter, ref IQueryable<Cours> query)  
    {  
        query = from Cours c1 in query  
                where  
                !(from Cours c2 in this.Courses  
                  select c2.Cours1.CourseId  
                  ).Contains(c1.CourseId)  
                select c1;  
    }  

person user901044    schedule 18.08.2011    source источник
comment
Джастин Андерсон дал ответ: чтобы получить это, код должен быть написан в методе PreprocessQuery, но это очень просто: › !c.ChildCourses.Any()); } `, где ChildCourses — это имя свойства навигации в сущности Cours, которое представляет коллекцию дочерних курсов.   -  person user901044    schedule 24.08.2011


Ответы (1)


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

Насколько я понимаю вашу модель данных, внутреннего выбора будет достаточно:

SELECT * FROM courses WHERE parentid IS NOT NULL

Это дает вам все строки, у которых есть родительская строка (которая будет вашими листовыми узлами).

Используя LINQ в LightSwitch PreprocessQuery(), это будет примерно так:

query = query.Where<Cours>(c => c.ParentId != null);

или не используя лямбда:

query = from c in query where c.ParentId != null select c;

Это работает, даже если у вас нет «.ChildCourses», чего, по-видимому, у вас нет.

person Satria    schedule 22.11.2011