#c# #linq
#c# #linq
Вопрос:
Это таблицы, которые у меня есть
Родительский элемент
- Родительское имя
- Родительская почта
- Идентификатор дочернего элемента 1
- Идентификатор дочернего элемента 2
- SchoolID
Дочерний элемент
- Идентификатор дочернего элемента
- Дочернее имя
Школа
- SchoolID
- Имя школы
Я хочу извлечь родительские данные следующим образом
ParentName, ParentEmail, SchoolName, ChildName1, ChildName2
Как я могу добиться этого, используя Linq в C #?
Я пробовал это
var result = from parent
join child
join school
но это не компиляция.
Комментарии:
1. Несколько вопросов / комментариев. Что произойдет, если у дочернего элемента более 1 родителя или если у родителя есть что-то другое, кроме 2 дочерних элементов. Ничто не имеет отношения к вашей «школьной» таблице. Код, который вы показываете, недостаточно близок к коду C # LINQ, чтобы называть его C #.
from
Предложение выглядитfrom p in parent
следующим образом . Ajoin
всегда включаетon
2. Спасибо, я пропустил ввод SchoolID в родительской таблице. Для этой задачи у каждого родителя есть 2 дочерних элемента, которые ходят в одну школу.
3. В качестве предложения взгляните на ответ, предоставленный @carlobos. Посмотрите, насколько у него достаточно кода, чтобы вы могли понять, о чем он думает, и чтобы вы могли запустить что-то, просто скопировав этот код в свой проект. В следующий раз, когда вы будете задавать вопрос, постарайтесь, чтобы ваш вопрос был так же хорошо организован и так же четко (но все же просто), как и этот ответ.
Ответ №1:
Вот запрос linq, который будет выполнять то, что вы просите. Я согласен с @flydog57, связанным с вашей структурой данных. Если вам не нужно применять правило 2 kid, было бы гораздо разумнее иметь SchoolID и Parent1 Parent2 в дочерней таблице, а не наоборот.
void Main()
{
var parents = GetParents();
var children = GetChildren();
var schools = GetSchools();
var child1parent = children.Join(parents, c => c.ChildId, p => p.Child1Id, (c, p) => new { Child = c, Parent = p });
var child2parent = children.Join(parents, c => c.ChildId, p => p.Child2Id, (c, p) => new { Child = c, Parent = p });
var results = child1parent
.Join(child2parent, c1 => c1.Parent.Child2Id, c2 => c2.Child.ChildId, (c1, c2) => new { Parent = c1.Parent, Child1 = c1.Child, Child2 = c2.Child })
.Join(schools, x => x.Parent.SchoolId, s => s.SchoolId, (x, s) => new { Parent = x.Parent, Child1 = x.Child1, Child2 = x.Child1, School = s })
.Select(x => new { x.Parent, x.School, x.Child1, x.Child2 });
results.ToList().ForEach(x => Console.WriteLine($"{x.Parent.ParentName} {x.Parent.ParentEmail}, {x.School.SchoolName}, {x.Child1.ChildName}, {x.Child2.ChildName}"));
}
public class Parent
{
public string ParentName { get; set; }
public string ParentEmail { get; set; }
public int Child1Id { get; set; }
public int Child2Id { get; set; }
public int SchoolId { get; set; }
}
public class Child
{
public int ChildId { get; set; }
public string ChildName { get; set; }
}
public class School
{
public int SchoolId { get; set; }
public string SchoolName { get; set; }
}
public List<Parent> GetParents()
{
return
new List<Parent>
{
new Parent { ParentName = "Donald", ParentEmail = "donald@disney.com", Child1Id = 1, Child2Id = 2, SchoolId = 1 },
new Parent { ParentName = "Lulubelle", ParentEmail = "Lulubelle@disney.com", Child1Id = 3, Child2Id = 4, SchoolId = 1 },
};
}
public List<Child> GetChildren()
{
return
new List<Child>
{
new Child { ChildId = 1, ChildName = "Huey" },
new Child { ChildId = 2, ChildName = "Dewey" },
new Child { ChildId = 3, ChildName = "Fethry" },
new Child { ChildId = 4, ChildName = "Abner" }
};
}
public List<School> GetSchools()
{
return
new List<School>
{
new School { SchoolId = 1, SchoolName = "Disney School of Rock" }
};
}