2011-08-27 27 views
1

问题是不被输出如何:加入使用LINQ三个列表对象

  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; 
    } 
} 

}地址

+0

发帖回答你的问题,而不是编辑的问题,这样做,使这个网站来搜索现有的解决方案,而不仅仅是一个有用的资源提出问题的地方。当有类似问题的人找到你的答案时,你可能会得到几个upvotes –

+0

需要更多的细节。你得到的错误是什么? – Schu

+0

我没有收到错误消息。该查询没有返回任何结果。我将它绑定到一个listview,我没有得到任何结果。没有错误,但。在我将其指定为数据源后,在调试模式下进行检查时,内部密钥等的所有结果都为空 – Donnie

回答

2

因为你已经告诉它它返回的第一个客户地址:

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

这里,addresses全部地址。我怀疑你只是想:

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

我会试一试..谢谢! – Donnie

+0

给了一个尝试,但它只是返回客户名称 - 我的列表绑定并留下地址应该是空白。 – Donnie

+0

@James:看看正在生成什么SQL,并在SQL Studio中运行它。看看这是否给你任何结果。 –

3

该查询不是很有表现力。如果我要加入使用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}); 
+0

的查询中混合了我的参考文献我喜欢在第一个代码片段中使用的语法有多短,如何将其转换为linq到对象语法?第一次,它的工作,但事情变得sl when,当我试图使用LINQ来对象语法。 – Donnie