Linq - 使用外部联接数据填充列表

时间:2017-11-23 08:59:30

标签: c# entity-framework linq linq-to-entities

是否可以使用linq查询为任何外连接子查询填充具有List的类?

我尝试了各种各样的变体,但无法让它发挥作用。

另一个选择是通过提供更多查询来填充类,但这样做性能会很差。

以下是一个示例,我尝试使用单个查询填充MyClass

var result = from p in PersonTable
join cars in CarTable on p.id equals cars.id_person into carsGroup.DefaultIfEmpty()
select new MyClass
{
    Person = new Person
    {
        Id = p.id,
        Name = p.name
    },
    Cars = new List<Car>()
    {
        Id = carsGroup....??

    }
}

    public class MyClass
    {
        public Person Person { get; set; }
        public List<PersonCar> Cars { get; set; }
    }

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

    }   

    public class PersonCar
    {
        public int Id { get; set; }
        pubint int IdPerson {get; set;}
        public string Description { get; set; }
    }

1 个答案:

答案 0 :(得分:1)

您提供的LINQ查询不正确。以下是一个测试,它将演示您可能正在寻找的功能:

    [TestMethod]
    public void TestMethod1()
    {
        var PersonTable = new List<Person>
        {
            new Person
            {
                Id = 1,
                Name = "Test1"
            },
            new Person
            {
                Id = 2,
                Name = "Test2"
            },
        };
        var CarTable = new List<PersonCar>
        {
            new PersonCar
            {
                Id = 1,
                IdPerson = 2
            },
            new PersonCar
            {
                Id = 2,
                IdPerson = 3
            }
        };

        var result = (from person in PersonTable
            join cars in CarTable on person.Id equals cars.IdPerson into carsGroup
                     from args in carsGroup.DefaultIfEmpty()
            select new MyClass
            {
                Person = person,
                Cars = carsGroup.ToList()
            }).ToList();

        Assert.AreEqual(2, result.Count);
        Assert.AreEqual(1, result.Count(res => res.Cars.Count == 0));
        Assert.AreEqual(1, result.Count(res => res.Cars.Count == 1));
    }