Dhara
Dhara

Reputation: 1972

Get result from list inside list

I have a structure like

class a
{
 public IList<b> bs{ get; set; }
        public class b
        {
            public string r{ get; set; }
            public IList<sl> sls{ get; set; }
            public class sl
            {
                public string sn{ get; set; }
                public string st{ get; set; }
            }
        }
}

the query is like if sn == "abc" then get r I have done

 a aobj = new a();
 var aa = aobj.bs.Where(c => c.sl != null).Select(c => c).ToList(); // here I get `r = "qwerty", sls will have data like sn = "qwerty0", st= "1" ; sn = "asdf" , st="2"; sn = "zxc" st = "abc"; sn="me" , st = "abc"
 var bb = aa.where(c => c.sl.Select(dr => dr.st.ToLower().Contains("abc"))); // I 'm here checking that `sn` contain abc or not
 var cc = bb.Select(c => c.r).ToList(); // result

my expected output of query is "zxc", "me"

but I am getting all the list not only contains abc.. can anyone suggest me what should I do? I am partitioning this query to debug. Thank you

Upvotes: 1

Views: 87

Answers (2)

shA.t
shA.t

Reputation: 16968

I think you can use a code like this:

var cc = a.bs
    .Where(w => w.sls?.Any(s => s.st?.ToLower().Contains("abc") ?? false) ?? false)
    .Select(c => c.r);

Upvotes: 0

rene
rene

Reputation: 42494

You'll need to use the Any operator to check if an enumerable collection has an item that meets a criteria.

You can't use Select as that only projects an item, it isn't returning an predicate and as such has no function in a where clause.

Here is your (fixed for syntax errors) changed code:

var aa = aobj.bs.Where(c => c.sls != null).Select(c => c).ToList();
// use Any here
var bb = aa.Where(c => c.sls.Any(dr => dr.sn.ToLower().Contains("abc")));
var cc = bb.Select(c => c.r).ToList();

And here is the test set I used:

a aobj = new a();
aobj.bs = new List<b>();
aobj.bs.Add(new b {
  r ="bar",
  sls = new List<sl>{
    new sl { sn="tets"},
    new sl { sn="no"}
  }
});

aobj.bs.Add(new b {
  r ="foo",
  sls = new List<sl>{
    new sl { sn="no"},
    new sl { sn="abc"}
  }
});

aobj.bs.Add(new b {
  r ="fubar",
  sls = new List<sl>{
    new sl { sn="no"},
    new sl { sn="abc"}
  }
});

This will output:

foo
fubar

If you combine all operators together you'll get:

var merged = aobj
   .bs
   .Where(c => c.sls != null 
      &&  c.sls.Any(dr => dr.sn.ToLower().Contains("abc")))
   .Select(c => c.r);

Upvotes: 1

Related Questions