Требуется помощь по запросу LINQ для Intersect - PullRequest
0 голосов
/ 09 марта 2010

LINQ гуру, я ищу помощь, чтобы написать запрос ...

У меня есть таблица с записями Person, и в ней есть столбец ParentID, допускающий значение NULL, так что это своего рода ссылка на себя, где каждая запись может иметь Parent.

Я ищу необработанные строки, родительские строки которых были обработаны. Этот SQL отлично работает:

SELECT *
  FROM Person
  where IsProcessed = 0 and
  ParentId in
  (
  select Id from Person 
  where IsProcessed = 1
  )

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

    var qParent = 
                from parent in db.Person
                where 
                parent.IsProcessed == true
                select parent.ID;

    var qChildren = from child in db.Person
                    where
                    child.IsProcessed == false
                    && child.ParentId.HasValue
                    select child.ParentId.Value;

    var q2 = qChildren.Intersect(qParent);

По некоторым причинам это приводит к SQL с предложением DISTINCT, и я озадачен, почему создается DISTINCT.

Мой главный вопрос - как написать LINQ для оператора SQL выше?

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 09 марта 2010

Пересечение - это операция set - она ​​предназначена для возврата набора различных элементов из пересечения. Мне кажется разумным, что он будет использовать DISTINCT в SQL. Например, может быть несколько детей с одним родителем - Intersect должен возвращать этот идентификатор только один раз.

Есть ли причина, по которой вы не хотите использовать соединение здесь?

var query = from parent in db.Person
            where parent.IsProcessed
            join child in db.Person.Where(child => !child.IsProcessed)
               on parent.ID equals child.ParentId.Value
            select child;
0 голосов
/ 09 марта 2010

Запрос можно перевести буквально на:

var parentIds = db.Person.Where(x => x.IsProcessed)
                      .Select(x => x.Id)
                      .ToList();
var result = db.Person.Where(x => !x.IsProcessed && parentIds.Contains(x => x.Id))
                   .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...