【问题标题】:how to filter nested list using Linq lambda如何使用 Linq lambda 过滤嵌套列表
【发布时间】:2014-08-07 13:20:46
【问题描述】:

我有一个班级人员,其中有一个地址和电话列表作为以下代码。 在我的查询中,我想要一个人员列表,但不包括已删除的地址和电话,但始终返回所有地址和电话,即使它们标记为已删除。如何使用 lambda 过滤那些嵌套列表?

public class Person{
    public int PersonId { get; set; }
    public string Name { get; set; }      
    public virtual ICollection<Address> Addresses { get; set; }
    public virtual ICollection<Phone> Phones{ get; set; }
    public virtual Company Company { get; set; }
}

public class Address{
    public int AddressId { get; set; }
    public string Street { get; set; }      
    public bool Deleted { get; set; }      
    [ScriptIgnore]
    public virtual Person Person { get; set; }
}

public class Phone{
    public int PhoneId { get; set; }
    public string Number{ get; set; }      
    public bool Deleted { get; set; }      
    [ScriptIgnore]
    public virtual Person Person { get; set; }
}

return GetDbSet<Person>()
    .Include("Address")
    .Include("Phones")
    .Where(i => i.Company.CompanyId == company.CompanyId)
    .OrderByDescending(o => o.CreateTime).ToList();

【问题讨论】:

    标签: linq entity-framework lambda linq-to-entities


    【解决方案1】:

    只需在Where 子句中添加条件即可排除已删除的地址和电话,例如:

    Where(i => i.Company.CompanyId == company.CompanyId &&
               i.Address.Any(r=> !r.Deleted) &&
               i.Phone.Any(r=> !r.Deleted))
    

    【讨论】:

    • 但是如果人没有任何地址或电话,则使用此条件返回将为空。换句话说,我想要的是无论如何归还此人,但只需带上他未删除的地址和电话...
    • 我创建的代码就是它...var person = GetDbSet&lt;Person&gt;() .Include("Address") .Include("Phones") .Where(i =&gt; i.Company.CompanyId == company.CompanyId) .OrderByDescending(o =&gt; o.CreateTime).ToList(); if (person != null) { person.Address = person.Address.Where(c =&gt; c.Deleted == false).ToList(); person.Phones = person.phones.Where(c =&gt; c.Deleted == false).ToList(); }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多