使用LINQ在类中查找对象

时间:2014-05-02 10:23:21

标签: c# linq

我想返回具有我发送的个人资料ID的项目。所以为了做到这一点,我需要遍历所有项目 - > WebProproperties - >轮廓。类结构就在问题的最后。

我宁愿使用LINQ而不是创建嵌套的foreach。我一直试图让这个工作超过一个小时。我被卡住了。

我的第一个想法是简单地使用where。但这并不奏效,因为你需要在另一方需要相同的东西。

this.Accounts.items.Where(a => a.webProperties.Where(b => b.profiles.Where(c => c.id == pSearchString)) ).FirstOrDefault();

我的第二个想法是尝试使用我不具备丰富经验的Exists

Item test =  from item in this.Accounts.items.Exists(a => a.webProperties.Exists(b => b.profiles.Exists(c => c.id == pSearchString))) select item;

这不起作用:

  

无法找到源类型' Bool'

的查询模式的实现
    public RootObject Accounts {get; set;}

    public class RootObject
    {
        public string kind { get; set; }
        public string username { get; set; }
        public int totalResults { get; set; }
        public int startIndex { get; set; }
        public int itemsPerPage { get; set; }
        public List<Item> items { get; set; }
    }

    public class Profile
    {
        public string kind { get; set; }
        public string id { get; set; }
        public string name { get; set; }
        public string type { get; set; }
    }

    public class WebProperty
    {
        public string kind { get; set; }
        public string id { get; set; }
        public string name { get; set; }
        public string internalWebPropertyId { get; set; }
        public string level { get; set; }
        public string websiteUrl { get; set; }
        public List<Profile> profiles { get; set; }
    }

    public class Item
    {
        public string id { get; set; }
        public string kind { get; set; }
        public string name { get; set; }
        public List<WebProperty> webProperties { get; set; }
    }

3 个答案:

答案 0 :(得分:6)

您可以使用Any()来确定存在。另请注意,许多扩展方法都具有带谓词的重载,包括FirstOrDefault()

this.Accounts.items.FirstOrDefault(a => a.webProperties
      .Any(b => b.profiles
          .Any(c => c.id == pSearchString)));

答案 1 :(得分:1)

您正在寻找我认为的.Any()操作。对于是否有与您的查询匹配的项目,这将返回true / false。

例如:

if (this.Accounts.Items.Any(i=>i.webProperties.Any(wp=>wp.profiles.Any(p=>p.id == MySearchId)));
编辑:你有完整的答案(在我撰写我的时候发布了)并且正如评论中所指出的那样,我的答案实际上并没有回复你找到的项目,只是让你知道是否有一个。您可以将第一个.Any重做为.FirstOrDefault以获得该匹配。 E.g。

var result = this.Accounts.Items.FirstOrDefault(i=>i.webProperties.Any(wp=>wp.profiles.Any(p=>p.id == MySearchId)))

答案 2 :(得分:0)

您可以使用下面提到的代码。

var abc = rr.items.Where(p => p.webProperties.Any(c => c.profiles.Any(d => d.id == "1"))).FirstOrDefault();

仅供您参考,您的课程应如下:

public class RootObject
{
    public string kind { get; set; }
    public string username { get; set; }
    public int totalResults { get; set; }
    public int startIndex { get; set; }
    public int itemsPerPage { get; set; }
    private List<Item> _items=new List<Item>();

    public List<Item> items
    {
        get { return _items; }
        set { _items = value; }
    }
}