Linq 林奇;“报告”;具有列表属性的问题
我有一个包含列表属性的实体对象。我想将列表值展开到右侧。作为LINQ的新手,我不知道该怎么做。我可以强类型一个对象,但是我必须在编译时知道计数/值,并且我想使它更具动态性 我想要的输出类似于:Linq 林奇;“报告”;具有列表属性的问题,linq,reporting,Linq,Reporting,我有一个包含列表属性的实体对象。我想将列表值展开到右侧。作为LINQ的新手,我不知道该怎么做。我可以强类型一个对象,但是我必须在编译时知道计数/值,并且我想使它更具动态性 我想要的输出类似于: 名称演示1演示2演示3 人名1TXTX 人名2TXOK 人名3txok Main类 public Main() { List<Event> events = new List<Event>(); events.Add(new Event() {
名称演示1演示2演示3
人名1TXTX
人名2TXOK
人名3txok
Main类
public Main()
{
List<Event> events = new List<Event>();
events.Add(new Event()
{
EventDate = DateTime.Now,
EventLocation = new Location() { State = "TX" },
EventName = "Demo1"
});
events.Add(new Event()
{
EventDate = DateTime.Now,
EventLocation = events[0].EventLocation,
EventName = "Demo2"
});
events.Add(new Event()
{
EventDate = DateTime.Now,
EventLocation = new Location() { State = "OK" },
EventName = "Demo3"
});
List<Person> people = new List<Person>();
Person person1 = new Person();
person1.Name = "Person Name1";
person1.Events.Add(events[0]);
person1.Events.Add(events[1]);
Person person2 = new Person();
person2.Name = "Person Name2";
person2.Events.Add(events[0]);
person2.Events.Add(events[2]);
Person person3 = new Person();
person3.Name = "Person Name3";
person3.Events.Add(events[0]);
person3.Events.Add(events[1]);
person3.Events.Add(events[2]);
people.Add(person1);
people.Add(person2);
people.Add(person3);
}
public Main()
{
列表事件=新列表();
添加(新事件()
{
EventDate=DateTime。现在,
EventLocation=新位置(){State=“TX”},
EventName=“Demo1”
});
添加(新事件()
{
EventDate=DateTime。现在,
EventLocation=事件[0]。EventLocation,
EventName=“Demo2”
});
添加(新事件()
{
EventDate=DateTime。现在,
EventLocation=new Location(){State=“OK”},
EventName=“Demo3”
});
列表人员=新列表();
Person person1=新的Person();
person1.Name=“Person Name1”;
person1.Events.Add(Events[0]);
person1.Events.Add(Events[1]);
Person person2=新的Person();
person2.Name=“Person Name2”;
person2.Events.Add(Events[0]);
person2.Events.Add(Events[2]);
Person person3=新的Person();
person3.Name=“Person Name3”;
person3.Events.Add(Events[0]);
person3.Events.Add(Events[1]);
person3.Events.Add(Events[2]);
添加(person1);
添加(person2);
添加(person3);
}
这取决于您是想在内存中还是在数据库中运行查询。在任何情况下,您都需要返回一个包含结果“动态”部分的列表,因为您无法动态生成匿名类型的成员(使用它们会很困难)
在内存中(如示例中),可以编写以下查询:
// Find names of all events (for all people)
var allNames =
(from p in people
from e in p.Events
select e.EventName).Distinct();
// Find events for every person
var res =
from p in people
let known = p.Events.ToDictionary(e => e.EventName)
select new {
p.Name,
Events = allNames.Select(n =>
known.ContainsKey(n)?known[n].EventLocation:"N/A")
};
第一个查询获取所有事件的名称(我们稍后使用它为每个人的所有事件查找一个值)。第二个查询遍历所有人。它首先创建包含事件的字典(用于在内存中快速查找),然后迭代所有事件名称并尝试在字典中查找它们(如果未找到,则返回“N/A”)