Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Enumerable.Concat not working

Tags:

c#

asp.net

linq

Below is the code:

string[] values = Acode.Split(',');
IEnumerable<Test> tst = null;

foreach (string a in values)
{
    if (tst== null)
        tst = entities.Test.Where(t=> (t.TCode == Convert.ToInt16(a)));
    else
        tst.Concat(entities.Test.Where(g => (g.TCode == Convert.ToInt16(a))));

}

return tst.ToList();

I am not able to get all the records in tst, it is giving me records only for the last value in array.

So if my array contains 1,2,3,4 I am getting records only for the 4. Whereas i need all the result for 1,2,3 and 4 get appended in tst.

Any help will be appreciated.

like image 702
Surendra Mourya Avatar asked Jun 14 '16 15:06

Surendra Mourya


2 Answers

Concat doesn't modify anything - it returns a new sequence, which you're currently ignoring.

However, rather than using Concat, you should just use SelectMany to flatten the sequence:

string[] values = Acode.Split(',');
return values.SelectMany(a => entities.Test.Where(t => t.TCode == Convert.ToInt16(a)))
             .ToList();

Or more efficiently, convert values into a List<short> and then you can do one query:

List<short> values = Acode.Split(',').Select(x => short.Parse(x)).ToList();
return entities.Test.Where(t => values.Contains(t.TCode)).ToList();
like image 175
Jon Skeet Avatar answered Nov 17 '22 06:11

Jon Skeet


That is because Concat will return a new instance of your enumerable.

Either use in your else :

tst = tst.Concat(...)

Or Change your Enumerable into list from the beginning :

string[] values = Acode.Split(',');
List<Test> tst= new List<Test>;

foreach (string a in values)
{
    tst.AddRange(entities.Test.Where(g => (g.TCode == Convert.ToInt16(a))));
}

return tst;
like image 45
Sidewinder94 Avatar answered Nov 17 '22 04:11

Sidewinder94