2

让我们假设:

  • 我有一个 EVENT 表
  • 我有一个 CLIENT 表
  • ADDRESS 表有一些列:UnitNo、StreetNo、StreetName、City、AddressType 等
  • 客户有很多事件,客户也可以有很多地址

因此,如果我想用客户 HOME 地址街道名称查询事件列表,我就去

var qry = db.Events
            .Select(evt => new {
               EventAddress =
               evt.Client
                  .Addresses
                  .FirstOrDefault(a => a.AddressType.Equals("HOME")).StreetName
            });

但是,如果我想获得完整的地址,我需要连接多个地址字段。目前我正在尝试类似的东西

var qry = db.Events
            .Select(evt => new {
               EventAddress =
               evt.Client
                  .Addresses
                  .FirstOrDefault(a => a.AddressType.Equals("HOME")).StreetNo + " " +
               evt.Client
                  .Addresses
                  .FirstOrDefault(a => a.AddressType.Equals("HOME")).StreetName + " " +
               evt.Client
                  .Addresses
                  .FirstOrDefault(a => a.AddressType.Equals("HOME")).City
            });

它不起作用,看起来也很丑
有没有更好的方法来制作 evt.Client.Addresses.FirstOrDefault(a => a.AddressType.Equals("HOME"))“可重复使用”,所以我可以去

var qry =
    db.Events
      .Select(evt => new {
         EventAddress = 
         STUFF.StreetNo + " " + STUFF.StreetName + " " + STUFF.City
});  

提前谢谢了!

更新:

感谢伊利安的回答,效果很好。基于此,我创建了答案的扩展版本

var qry =
    db.Events
      .Select(evt => new {
         EventAddress = 
         db.Addresses.Select(a => new
           {
             ClientId = a.ClientId,
             AddressType = a.AddressType,
             FullAddress = (a.addStreetNo ?? "") + (a.addStreetName ?? "")
           })
         .FirstOrDefault(a => a.ClientId == e.Client.ClientId && a.AddressType.Equals("HOME"))
         .FullAddress
});
4

1 回答 1

0

使用查询语法:

var qry =
    from evt in db.Events
    let firstAddress = evt.Client.Addresses.FirstOrDefault(a => a.AddressType.Equals("HOME"))
    where firstAddress != null
    select new
    {
        EventAddress = firstAddress.StreetNo + " " +
                       firstAddress.StreetName + " " +
                       firstAddress.City
    }
于 2012-06-08T01:49:50.333 回答