2010-11-01 5 views
3

У меня есть таблица в SQL Server, которая строится так:Использование LINQ для выбора иерархических данных?

id Name Parent 
-- ---- ------ 
1 foo null 
2 bar 1 
3 oof null 
4 rab 3 
. 
. 
. 

Мне нужно получить данные из двух связанных строк в одну строку в .NET DataTable. Мой желаемый DataTable будет выглядеть следующим образом:

Parent Child 
------ ----- 
foo  bar 
oof  rab 

Я был в состоянии сделать это, используя приведенный ниже запрос:

with temp as 
(
    SELECT 1 id,'foo' name, null parent 
    UNION 
    select 2,'bar', 1 
    UNION 
    SELECT 3,'oof', null 
    UNION 
    select 4,'rab', 3 
) 

SELECT t1.name parent, t2.name child 
FROM temp t1 
INNER JOIN temp t2 
ON t1.id = t2.parent 

Но мне интересно, если есть простой способ сделать это с помощью LINQ? (Наш магазин использует LINQ для большинства доступа к базе данных)

ответ

1
DataTable dt = new DataTable() 
//Other DT stufff 

//LINQ Query 
var data = from t in table 
      select t; 

//Loop to create DT 
foreach (item in data.ToList()) 
{ 
    DataRow dr = new DataRow(); 
    dr["Parent"] = item.Name; 
    dr["Child"] = item.item.Name; //Where item.item is your FK relation to itself 
    dt.Rows.Add(dr); 
} 
+0

заявление Ваш LINQ здесь является не оп ... почему бы не использовать LINQ присоединиться? –

0
data.Select(d => d.Parent).Select(p => p.Property).ToList(); 

выберите просто проецировать результаты обратно к вам лениво загрузится. Так что просто выберите то, что вам нужно, либо в локальном списке, либо с небольшим синтаксисом, вы можете использовать анонимную проекцию, чтобы объединить все уровни данных и фильтровать их до .ToList() назад к ya.

0
var result = source.Select(child => new { 
Child = child, 
Parent = source.SingleOrDefault(parent => parent.ID == child.Parent) 
}); 
2

Я предпочитаю, чтобы стыки, как присоединяется

var result = from t1 in table 
join t2 in table on t1.id = t2.parent 
select new { parent = t1.name, child = t2.name }