【问题标题】:How To: Joining three lists using Linq to objects操作方法:使用 Linq to 对象连接三个列表
【发布时间】:2011-08-27 04:51:14
【问题描述】:

问题是地址没有输出

          using System;
          using System.Collections.Generic;
          using System.Linq;
          using System.Text;

          namespace LinqToObjects
          {
            class Program
          {
    static void Main(string[] args)
    {
        var customers = Customer.GetAllCustomers();
        var addresses = Address.GetAllAddresses();
        var addressRelations = AddressRelation.GetAllAddressRelations();

        var results = customers
                    .Join(addressRelations,
                    c => c.CustomerID,
                    ar => ar.CustomerID,
                    (c, ar) => new
                    {
                        CustomerName = c.FirstName + " " + c.LastName,
                        CustomerID = c.CustomerID,
                        AddressRelID = ar.AddressID
                    });
        var resultsJoined = results
                       .GroupJoin(addresses,
                        ar => ar.AddressRelID,
                        a => a.AddressID,
                        (ar, a) => new
                        {
                            CustomerName = ar.CustomerName,
                            AddressLine = addresses.Select(b => b.StreetAddress).FirstOrDefault()
                        });
        foreach(var item in resultsJoined)
        {
            Console.WriteLine(item.CustomerName);
            Console.WriteLine(item.AddressLine);
            Console.WriteLine("-----------------");

        }
    }
}

public class AddressRelation
{
    public int AddressRelationID { get; set; }
    public int CustomerID { get; set; }
    public int AddressID { get; set; }
    public AddressRelation(int id, int customerId, int addressId)
    {
        AddressRelationID = id; CustomerID = customerId; AddressID = addressId;
    }
    public static List<AddressRelation> GetAllAddressRelations()
    {
        var AllAddressRelations = new List<AddressRelation>();//simulate data returned from db
        var addressRelation1 = new AddressRelation(1, 1, 1);
        var addressRelation2 = new AddressRelation(2, 3, 3);
        var addressRelation3 = new AddressRelation(3, 2, 2);
        AllAddressRelations.Add(addressRelation1);
        AllAddressRelations.Add(addressRelation2);
        AllAddressRelations.Add(addressRelation3);

        return AllAddressRelations;
    }
}
public class Address
{
    public int AddressID { get; set; }
    public string StreetAddress { get; set; }
    public Address(int id, string streetAddress)
    {
        AddressID = id; StreetAddress = streetAddress;
    }
    public static List<Address> GetAllAddresses()
    {
        var AllAddresses = new List<Address>();
        Address customer1Address = new Address(1, "Elm St");
        Address customer2Address = new Address(2, "Willow Way");
        Address customer3Address = new Address(3, "Linq Ln");
        AllAddresses.Add(customer1Address);
        AllAddresses.Add(customer2Address);
        AllAddresses.Add(customer3Address);
        return AllAddresses;
    }
}
public class Customer
{
    public int CustomerID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public Customer(int id,string firstName, string lastName)
    {
        CustomerID = id; FirstName = firstName; LastName = lastName;
    }
    public static List<Customer> GetAllCustomers()
    {
        var AllCustomers = new List<Customer>();
        var customer1 = new Customer(1, "James", "T");
        var customer2 = new Customer(2, "Donnie", "H");
        var customer3 = new Customer(3, "Sarah", "H");
        AllCustomers.Add(customer1);
        AllCustomers.Add(customer2);
        AllCustomers.Add(customer3);
        return AllCustomers;
    }
}

}

【问题讨论】:

  • 需要更多细节。你遇到了什么错误?
  • 我没有收到错误消息。查询没有返回任何结果。我将它绑定到列表视图,但没有得到任何结果。虽然没有错误。当我将它分配为数据源后在调试模式下检查它时,内部键等的所有结果都是空的
  • 发布您的问题的答案而不是编辑问题,这样做使此站点成为搜索现有解决方案的有用资源,而不仅仅是提问的地方。随着时间的推移,当有类似问题的人找到你的答案时,你可能会得到一些支持
  • 这不是一个真正的答案 - 它应该是一个评论。
  • 是的,我知道.. 我没有足够的代表投票否决它

标签: linq c#-4.0 linq-to-objects


【解决方案1】:

查询不是很有表现力。如果我要使用 LinqToObjects 加入三个列表,我会这样做:

var query =
  from c in customers
  join xr in addressRelations on c.CustomerId equals xr.CustomerId
  join a in addresses on xr.AddressId equals a.AddressId
  select new {Customer = c, Address = a};

看起来又是一个错误。我敢打赌,AddressRelId 是 AddressRelation 表的键,而不是您想用来连接到 Address 表的键。

.GroupJoin(addresses, 
ar => ar.Address**Rel**ID, 
a => a.AddressID,

回应评论:

var query = customers
  .Join(addressRelations,
    c => c.CustomerId,
    xr => xr.CustomerId,
    (c, xr) => new {c, xr})
  .Join(addresses,
    x => x.xr.AddressId,
    a => a.AddressId,
    (x, a) => new {c = x.c, xr = x.xr, a = a})
  .Select(x => new {Customer = x.c, Address = x.a});

【讨论】:

  • 我喜欢你的第一个代码 sn-p 中的语法有多短。如何将其转换为 linq to objects 语法?那是我第一次做的事情,它奏效了,但是当我尝试使用 linq to object 语法时,事情变得非常草率。
【解决方案2】:

它会返回第一个客户地址,因为您已经告诉它:

AddressLine = addresses.Select(b => b.AddressLine1).FirstOrDefault()

这里,addresses 是所有个地址。我怀疑你只是想要:

AddressLine = a.Select(b => b.AddressLine1).FirstOrDefault()

【讨论】:

  • 我会试一试.. 谢谢!
  • 试一试,但它只返回 CustomerName - 我的列表绑定并在地址应有的位置留下一个空白区域。
  • @James:看看正在生成什么 SQL,然后在 SQL Studio 中运行它。看看这是否会给你带来任何结果。
  • 我不知道该怎么做?它不是从 dbml 或上下文中查询。我有 3 个对象列表,我正在尝试将它们与 linq 一起作为练习
  • 关闭-主题...您的书有非常棒的评论。可能很快就会买那个sucka。
猜你喜欢
  • 1970-01-01
  • 2018-11-07
  • 1970-01-01
  • 1970-01-01
  • 2012-05-06
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多