【问题标题】:Assign IEnumerable list inside linq query在 linq 查询中分配 IEnumerable 列表
【发布时间】:2013-05-17 14:44:47
【问题描述】:

我在使用以下 linq 查询时遇到问题。

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

【问题讨论】:

  • 如果地址和客户表是一对一的关系(Client.ClinetID - Client.AddressID -> Address.AddressID),​​一个客户怎么可能拥有多个地址?

标签: c# linq


【解决方案1】:

而不是

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

【讨论】:

  • 您好!实际上 tblAdvanceclient 中的地址列是不同的,它与我正在谈论的地址列表无关
  • @chamara,仔细查看您的表格设计,您将有一个针对客户的地址,而在地址中的单个条目,您将有多个客户,这是要求吗?因为它看起来是错误的,它应该是其他的,就像一个客户端可以/可以有多个地址。
【解决方案2】:

您是否使用 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 会为你加载地址数据。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      如果我没有理解正确,我很抱歉,但我认为应该如下,因为地址和客户表通过 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;
                                          };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-09
        • 2015-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多