2013-05-17 56 views
2

我遇到了以下linq查询的问题。在linq查询中分配IEnumerable列表

public class Address 
    { 
     public int addressID { get; set; } 
     public string address { get; set; } 
    } 

public class AdvanceClient 
    { 
     public int ClientID { get; set; } 
     public string Name { get; set; } 
     public string Mobile { get; set; } 

     public IEnumerable<Address> Addresses { get; set; } 

    } 

在下面的linq查询中,我想将IEnumerable地址列表分配给Addresses属性。我在tblAdvanceClient和tblAddress表之间有一对多的关系。

IEnumerable<AdvanceClient> addcli = from tbcli in dc.tblAdvanceClients 
               join tbadd in dc.tblAddresses 
               on tbcli.AddressID equals tbadd.AddressID 
               select new AdvanceClient 
               { 
                ClientID = tbcli.ClientID, 
                Company = tbcli.Company, 
                Fax = tbcli.Fax, 
                Mobile = tbcli.Mobile, 
                Name = tbcli.Mobile, 
                Telephone = tbcli.Telephone, 
                Addresses = new Address { } // Here i need to get the list of address to each client 
               }; 

enter image description here

+2

怎么能一个客户端有多个一个地址,如果地址和客户端表具有一对一的关系(Client.ClinetID - Client.AddressID - > Address.AddressID)? –

回答

3

,而不是

Address = new Address { } 

将其更改为

Address = tbcli.Addresses //Since you already have a property in AdvanceClient 

所以,你的查询将是:

IEnumerable<AdvanceClient> addcli = 
     from tbcli in dc.tblAdvanceClients 
     join tbadd in dc.tblAddresses 
      on tbcli.AddressID equals tbadd.AddressID 
      select new AdvanceClient 
      { 
       ClientID = tbcli.ClientID, 
       Company = tbcli.Company, 
       Fax = tbcli.Fax, 
       Mobile = tbcli.Mobile, 
       Name = tbcli.Mobile, 
       Telephone = tbcli.Telephone, 
       Address = tbcli.Addresses 
      }; 
+0

你好!实际上tblAdvanceclient中的地址列是不同的,它与我在谈论的地址列表无关 – chamara

+1

@chamara,仔细查看您的表格设计,您将拥有一个针对客户端的单个地址,地址,你会有多个客户端,这是需求?因为它看起来不对,应该是另一回事,就像客户可以/可能有多个地址一样。 – Habib

0

我很抱歉,如果我没有理解正确的,但我认为它应该是如下因为地址和客户端表有一个一对一reletionship通过AddressID

public class Address 
{ 
    public int addressID { get; set; } 
    public string address { get; set; } 
} 

public class AdvanceClient 
{ 
    public int ClientID { get; set; } 
    public string Name { get; set; } 
    public string Mobile { get; set; } 

    //It can has only one address 
    public Address Address { get; set; } 

} 

和查询:

IEnumerable<AdvanceClient> addcli = from tbcli in dc.tblAdvanceClients 
            join tbadd in dc.tblAddresses 
            on tbcli.AddressID equals tbadd.AddressID 
            select new AdvanceClient 
            { 
             ClientID = tbcli.ClientID, 
             Company = tbcli.Company, 
             Fax = tbcli.Fax, 
             Mobile = tbcli.Mobile, 
             Name = tbcli.Mobile, 
             Telephone = tbcli.Telephone, 
             //tbadd is the address which you are looking for 
             Addresses = tbadd; 
            }; 
1

您是否使用EntityFramework检索数据?如果是这样,那么你可以改变你的模型



public class Address 
    { 
     public int addressID { get; set; } 
     public string address { get; set; } 
    } 

public class AdvanceClient 
    { 
     public int ClientID { get; set; } 
     public string Name { get; set; } 
     public string Mobile { get; set; } 
     public int AddressId { get; set; } 

     public virtual Address Addresses { get; set; } 

    } 

EntityFramework将为您加载地址数据。

1

这种设计是有点奇怪对我来说,具有总是只包含一个项目的地址列表,但如果你确实需要这一点,你可以用下面的查询:

var addcli = from tbcli in dc.tblAdvanceClients 
       join tbadd in dc.tblAddresses 
       on tbcli.AddressID equals tbadd.AddressID into addrList 
       select new AdvanceClient 
       { 
        ClientID = tbcli.ClientID, 
        Company = tbcli.Company, 
        Fax = tbcli.Fax, 
        Mobile = tbcli.Mobile, 
        Name = tbcli.Mobile, 
        Telephone = tbcli.Telephone, 
        Addresses = from row in addrList 
           select new Address 
           { 
            addressID = row.AddressID, 
            address = row.Address 
           } 
       };