Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用linq通过主键组合三个对象列表_C#_Asp.net_Data Binding_Linq To Objects - Fatal编程技术网

C# 如何使用linq通过主键组合三个对象列表

C# 如何使用linq通过主键组合三个对象列表,c#,asp.net,data-binding,linq-to-objects,C#,Asp.net,Data Binding,Linq To Objects,我正在尝试合并3个对象列表。我有一个人名单,地址名单和地址关系名单。 我想将这些列表合并成一个按person.id排序的新列表,将其用作listview的数据源,然后能够访问aspx页面中的属性 这可能吗? using System.Linq; class Person { public int Id; public string Name; } class Address { public int Id; public string Street; }

我正在尝试合并3个对象列表。我有一个人名单,地址名单和地址关系名单。 我想将这些列表合并成一个按person.id排序的新列表,将其用作listview的数据源,然后能够访问aspx页面中的属性

这可能吗?

using System.Linq;

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

class Address
{
    public int Id;
    public string Street;
}

class PersonAddress
{
    public int PersonId, AddressId;
}

public class Program
{
    public static void Main(string[] args)
    {
        var personList = new []
        {
            new Person { Id = 1, Name = "Pete" },
            new Person { Id = 2, Name = "Mary" },
            new Person { Id = 3, Name = "Joe" }
        };

        var addressList = new []
        {
            new Address { Id = 100, Street = "Home Lane" },
            new Address { Id = 101, Street = "Church Way" },
            new Address { Id = 102, Street = "Sandy Blvd" }
        };

        var relations = new [] 
        {
            new PersonAddress { PersonId = 1, AddressId = 101 },
            new PersonAddress { PersonId = 3, AddressId = 101 },

            new PersonAddress { PersonId = 2, AddressId = 102 },
            new PersonAddress { PersonId = 2, AddressId = 100 }
        };

        var joined = 
                    from par in relations
                    join p in personList
                        on par.PersonId equals p.Id
                    join a in addressList
                        on par.AddressId equals a.Id
                    select new { Person = p, Address = a };

        foreach (var record in joined)
            System.Console.WriteLine("{0} lives on {1}", 
                                   record.Person.Name, 
                                   record.Address.Street);
    }
}
产出:

Pete lives on Church Way
Mary lives on Sandy Blvd
Mary lives on Home Lane
Joe lives on Church Way

使用处理数据的替代方法进行更新(使用许多属性可以更好地扩展,并且支持更好地更新它们,因此使数据类成为非ValueType),非常感谢!现在,我需要考虑如何将其连接到数据源,数据绑定到listview,并访问aspx页面中的属性。您“可以”始终在SQL Server中构建连接,当您生成DBML文件时,它将为您生成连接。然后您可以使用
person.address.Street
访问某人的地址。上述方法是一种很好的解耦方法,效果最好,首先是EF代码。是的,我没有使用dbml文件。我这么做是为了学习Linq,真的很想看看严格按照返回的列表来做会有多痛苦。@Anton:我自己解决了;我是对的,它不起作用,但修复方法只是重新排序表扫描。(见现场演示)