【问题标题】:How to combine three lists of objects by primary key using linq如何使用linq按主键组合三个对象列表
【发布时间】:2011-08-23 11:04:06
【问题描述】:

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

这可能吗?

【问题讨论】:

    标签: c# asp.net data-binding linq-to-objects


    【解决方案1】:

    大概

    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
    

    【讨论】:

    • 更新了处理数据的替代方式(可以更好地扩展许多属性,并更好地支持更新它们,因此使数据类成为非值类型)
    • 非常感谢!现在我要弄清楚如何将它连接到 DataSource ,数据绑定到列表视图,并访问 aspx 页面中的属性
    • 您“可以”始终在 SQL Server 中构建连接,并且当您生成 DBML 文件时,它会为您生成连接。然后您可以使用Person.Address.Street 访问一个人的地址。上述方法是一种很好的解耦方法,效果最好的是 EF Code First。
    • 是的,我没有使用 dbml 文件。这样做是为了学习 Linq,并且真的很想看看严格使用返回的列表会带来多大的痛苦。
    • @Anton:自己修好了;我是对的,它不会起作用,但修复只是重新排序表扫描。 (在ideone.com/qTVI5 上观看演示)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多