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() {

我有一个包含列表属性的实体对象。我想将列表值展开到右侧。作为LINQ的新手,我不知道该怎么做。我可以强类型一个对象,但是我必须在编译时知道计数/值,并且我想使它更具动态性

我想要的输出类似于:


名称演示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”)