创建嵌套在LINQ查询中的对象中的列表

时间:2013-01-12 23:34:45

标签: c# linq entity-framework

我有两张看起来像这样的表:

-- Houses
houseid personid
1       11
1       12
1       13
2       232
2       5533
2       40


-- People
personid person name
11       John
12       Jane
13       Zoe

和一个班级

class House
{
    List<string> people_name {get; set;};
}

我想返回一个对象House,其中包含住在给定房屋中的所有人的名字。我最接近实现它的是在对象House中返回IQueryable,因为你无法在查询中调用ToList

LINQ to Entities does not recognize the method 'System.Collections.Generic.List`1[System.String]
ToList[String](System.Collections.Generic.IEnumerable`1[System.String])'
 method, and this method cannot be translated into a store expression.

1 个答案:

答案 0 :(得分:2)

您可以在select语句中创建House对象。下面的代码创建了一个House对象列表,每个对象都包含相应的名称:

class Program
{
    static void Main(string[] args)
    {
        List<KeyValuePair<int, int>> housePersonPairs = new List<KeyValuePair<int, int>>();
        housePersonPairs.Add(new KeyValuePair<int, int>(1, 11));
        housePersonPairs.Add(new KeyValuePair<int, int>(1, 12));
        housePersonPairs.Add(new KeyValuePair<int, int>(1, 13));
        housePersonPairs.Add(new KeyValuePair<int, int>(2, 232));
        housePersonPairs.Add(new KeyValuePair<int, int>(2, 5533));
        housePersonPairs.Add(new KeyValuePair<int, int>(2, 40));

        List<Person> persons = new List<Person>();
        persons.Add(new Person() { ID = 11, Name = "John" });
        persons.Add(new Person() { ID = 12, Name = "Jane" });
        persons.Add(new Person() { ID = 13, Name = "Zoe" });
        persons.Add(new Person() { ID = 232, Name = "Name1" });
        persons.Add(new Person() { ID = 5533, Name = "Name2" });
        persons.Add(new Person() { ID = 40, Name = "Name3" });

        var houseAndNames = housePersonPairs.Join(
            persons,
            hpp => hpp.Value,
            p => p.ID, 
            (hpp, p) => new { HouseID = hpp.Key, Name = p.Name });

        var groupedNames = from hn in houseAndNames
                     group hn by hn.HouseID into groupOfNames
                     select groupOfNames.Select(x => x.Name).ToList();

        List<House> houses = groupedNames.Select(names => new House() { people_name = names }).ToList();

    }
}

public class Person
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public class House
{
    public List<string> people_name { get; set; }
}