Использование LINQ для выбора иерархических данных? - PullRequest
3 голосов
/ 02 ноября 2010

У меня есть таблица в SQL Server, которая имеет следующую структуру:

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 для большей части доступа к базе данных)

Ответы [ 4 ]

2 голосов
/ 02 ноября 2010

Я предпочитаю сохранять объединения как объединения

var result = from t1 in table
join t2 in table on t1.id = t2.parent
select new { parent = t1.name, child = t2.name }
1 голос
/ 02 ноября 2010
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 голосов
/ 02 ноября 2010
var result = source.Select(child => new { 
 Child = child, 
 Parent = source.SingleOrDefault(parent => parent.ID == child.Parent)
});
0 голосов
/ 02 ноября 2010
data.Select(d => d.Parent).Select(p => p.Property).ToList();

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...