2013-01-24 2 views
-1

У меня есть формат табличногоLinq для SQL, чтобы вернуть родительские строки

Id (int) 
ParentId (int) 

мне нужно запросить все строки, которые связаны друг с другом так ParentID = Id, но гнездовые несколько раз

Я немного застрял в том, как решить эту проблему, я могу вернуться к хранимой процедуре, но я действительно хотел попробовать это в чистом linq для sql.

+0

извинения, что я имею в виду, я немного застрял. Не уверен, как это сделать в малейшей степени. – Dreamwalker

+0

Вам нужен код sql? – daryal

+0

Если мне нужно вернуться к SQL, то я смогу прекрасно управлять этой частью. Это скорее случай, когда он предпочитает быть в linq. – Dreamwalker

ответ

3

Я думаю, что у вас есть 2 варианта:

  • Вы должны явно принести родителей, которые вызывает много отдельных вызовов на дб. Я думаю, что такая архитектура (для рекурсивной репликации данных саморегуляции с одним вызовом из db) не поддерживается в L2S или L2E.

  • В этих сценариях я стараюсь использовать собственные возможности моего db (в данном случае: CTE). Вы можете использовать свои пользовательские запросы sql, а также определить типы возврата с помощью db.ExecuteQuery<ReturnType>. Если вы находитесь на сервере SQL 2005+ можно использовать следующий синтаксис:

    var allGroups =
    db.ExecuteQuery(
    @"WITH n(Id, ParentId) AS
    (SELECT Id, ParentId
    FROM MyTable
    WHERE Id = {0}
    UNION ALL
    SELECT nplus1.Id, nplus1.ParentId
    FROM MyTable as nplus1, n
    WHERE n.ParentId = nplus1.Id)
    SELECT Id, ParentId FROM n",
    firstChildId).ToList();

Таким образом, вы выбрали все объекты в одном вызове. Выезд How to do an upper recursive self-join in SQL Server? и Simplest way to do a recursive self-join in SQL Server?.

+1

Я искал и пробовал вещи, и, как вы сказали, это всегда приводит к нескольким вызовам в db, что не очень хорошо. Я думаю, что вернусь к процедуре, как я уже упоминал, поскольку мы вызывающе не хотим, чтобы SQL-код в библиотеке на всякий случай нам нужно использовать mysql/oracle в будущем (есть большая вероятность). Я отвечу на ваш ответ, поскольку вы также предоставили дополнительную информацию о SQL, и процедура будет работать в linq. – Dreamwalker

Смежные вопросы