C# LINQ:将父对象属性和单个子属性作为平面结构获取

C# LINQ:将父对象属性和单个子属性作为平面结构获取,c#,linq,C#,Linq,我有一个包含在名为Branch的父对象中的地址列表。分支可能有也可能没有定义这些地址,我需要得到一个平面层次结构或这些分支和地址 var x = from p in CurrentBranchList where p.ScheduledForDeletion == false from c in p.Addresses where c.ScheduledForDeletion == false && c.AddressTypeI

我有一个包含在名为Branch的父对象中的地址列表。分支可能有也可能没有定义这些地址,我需要得到一个平面层次结构或这些分支和地址

var x = from p in CurrentBranchList 
        where p.ScheduledForDeletion == false
        from c in p.Addresses 
        where c.ScheduledForDeletion == false && c.AddressTypeId == 3
        select new
        {
          BranchId = p.BranchId,
          Name = p.Name,
          Address = (c == null) ? "" : c.Address1 + " " + c.Address2,
          City = (c == null) ? "" : c.City,
          State = (c == null) ? 0 : c.StateId
        };
以上是我尝试过的,但如果地址丢失,我就得不到关于分支机构的任何信息……我仍在试图找出如何与Linq合作。在SQL中,我会加入这两个表来获取这些信息

有人能帮我吗?我相信这很容易。谢谢我知道这和()很相似,但在那一个里,孩子总是存在的


编辑-工作解决方案 下面的代码似乎适合我。我不能反对源数据库,因为CurrentBranchList中包含的对象是在内存中编辑的,持久化是在单个操作中执行的

var x = from p in CurrentBranchList
        join c in CurrentBranchList.SelectMany(b => b.Addresses) 
          on p.EntityId equals c.EntityId into ur 
        where p.ScheduledForDeletion == false      
        from u in ur.DefaultIfEmpty() 
        select new
        {
          BranchId = p.BranchId,
          Name = p.Name,
          Address = (u == null) ? "" : u.Address1 + " " + u.Address2,
          City = (u == null) ? "" : u.City,
          State = (u == null) ? 0 : u.StateId
        };
谢谢你的帮助。这些链接真的帮助我理解了需要发生什么

我还尝试了Daniel Brückner的解决方案,它看起来更优雅,需要的输入更少。:-)似乎在我尝试过的两种情况下都有效

这是它的样子

var xx = CurrentBranchList.SelectMany(b => b.Addresses.DefaultIfEmpty().Select(a => new 
        {
          BranchId = b.BranchId,
          Name = b.Name,
          Address = (a == null) ? "" : a.Address1 + " " + a.Address2,
          City = (a == null) ? "" : a.City,
          State = (a == null) ? 0 : a.StateId
        }));

您需要左外部联接而不是内部联接。 .

看一看,其中显示了如何使用DefaultIfEmtpy构造来执行左连接

恐怕不是Linq最容易发现的功能。

IQueryable branchs=getBranchs();
IQueryable<Branch> branches = GetBranches();

var result = braches.
   SelectMany(b => b.Addresses.
      DefaultIfEmpty().
      Select(a => new { Branch = b, Address = a }));
var结果=分支。 选择多个(b=>b.address)。 DefaultIfEmpty()。 选择(a=>new{Branch=b,Address=a});
对不起,也许我来晚了——但我遇到了类似的问题,即使在发表这篇文章5.5年后也找不到具体的答案。我的解决方案(未优化-但有效):

公共类年费清单
{
公共字符串名称;
公众国际年日;
}
公务舱就餐日
{
公共字符串名称;
公众名单年日;
}
公共静态类程序
{
静态void Main()
{
var eatouts=新列表
{
new EatOutDaysOfYear{Name=“amit”,YearDays=new List(){59,37,31,17,29},
new EatOutDaysOfYear{Name=“prakash”,YearDays=new List(){6,18,13},
new EatOutDaysOfYear{Name=“sarvo”,YearDays=new List(){9,7,47,56,82,96},
新的EatOutDaysOfYear{Name=“akshay”,YearDays=new List(){8,5,2,4}
};
//查询以获取父元素('Name')和单个子元素的属性
var账单=支出
.选择Many(a=>a.YearDays
.Select(b=>newyeardaybill{Name=a.Name,YearDay=b}))
.OrderBy(d=>d.Name)//可选
.ThenBy(e=>e.YearDay)//可选
.ToList();
bills.ForEach(a=>Console.WriteLine(string.Concat(a.Name,“|”,a.YearDay));
}
}
public class YearDayBill
{
    public string Name;
    public int YearDay;
}

public class EatOutDaysOfYear
{
    public string Name;
    public List<int> YearDays;
}

public static class Program
{
    static void Main()
    {
        var eatouts = new List<EatOutDaysOfYear>
        {
            new EatOutDaysOfYear {Name = "amit", YearDays = new List<int>() {59, 37, 31, 17, 29}},
            new EatOutDaysOfYear {Name = "prakash", YearDays = new List<int>() {6, 18, 13}},
            new EatOutDaysOfYear {Name = "sarvo", YearDays = new List<int>() {9, 7, 47, 56, 82, 96}},
            new EatOutDaysOfYear {Name = "akshay", YearDays = new List<int>() {8, 5, 2, 4}}
        };

        // query to get properties of parent ('Name') and single child element 
        var bills = eatouts
            .SelectMany(a => a.YearDays
                .Select(b => new YearDayBill {Name = a.Name, YearDay = b})) 
            .OrderBy(d => d.Name)     // optional 
            .ThenBy(e => e.YearDay)   // optional 
            .ToList();

        bills.ForEach(a => Console.WriteLine(string.Concat(a.Name, " | ", a.YearDay)));
    }
}