Linq оставил внешнее объединение в тот же список, чтобы найти листовые узлы - PullRequest
0 голосов
/ 06 июня 2011

У меня в памяти List<TreeNode>. Можно ли использовать linq для выбора всех листовых узлов?

SQL будет выглядеть примерно так:

SELECT      
    t1.Name
FROM 
    Tree t1 
    LEFT JOIN Tree t2 
        ON t1.UserId = t2.ParentId  
WHERE 
    t2.UserId is null

Самое близкое, что у меня есть (мне все еще нужно отфильтровать нули):

                       var test = from t1 in list
                       join t2 in list
                       on t1.UserId equals t2.ParentId into g                   

                       from result in g.DefaultIfEmpty()          

                       select new { 
                       t1.Name
                       };

Который выдает правильный sql (при тестировании в linqpad) без предложения where. Я не могу получить доступ к t2, где я выбираю анонимный объект, если я пытаюсь отфильтровать результаты по t2 == null. Нужно ли мне создать копию списка и присоединиться к ней?

Ответы [ 2 ]

2 голосов
/ 06 июня 2011

РЕДАКТИРОВАТЬ: Хорошо, я бы неправильно понял раньше. То есть вы в основном следите за элементами (t1) в списке, в которых нет элемента t2, такого как t1.UserId == t2.ParentId? В этом случае я предлагаю вам использовать:

Я подозреваю, что вы хотите:

var test = from t1 in list
           join t2 in list
              on t1.UserId equals t2.ParentId into g
           where !g.Any()
           select t1.Name;

Обратите внимание, что здесь я не использую анонимный тип, поскольку вы выбираете только одно значение.

Другой альтернативой будет:

var parents = new HashSet<Guid>(list.Where(x => x.ParentId != null)
                                    .Select(x => x.ParentId.Value));
var query = list.Where(t1 => !parents.Contains(t1.UserId));
0 голосов
/ 06 июня 2011

Попробуйте это:

var test = from t1 in list
           join t2 in list
           on t1.UserId equals t2.ParentId into g                   
           from result in g.DefaultIfEmpty()          
           where t2.UserId == null
           select new { 
               t1.Name
           };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...