Het onderstaande is een console applicatie waarbij je kunt zien dat ik eerst een element vul en daarna uitlees. Echter de variabele is null bij het uitlezen. De reden is omdat IEnumerable iedere keer geëvalueerd wordt. In de foreach van de Uitlezen methode wordt dus nogmaals de x => x.TheDataAccessElement uitgevoerd waardoor de dbColumnNames dus weer null wordt.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IEnumerableTest
{
public class BusinessElement
{
public string name;
public string direction;
public DataAccessElement TheDataAccessElement
{
get
{
return new DataAccessElement() { name = name, direction = direction };
}
}
}
public class DataAccessElement
{
public string name { get; set; }
public string direction { get; set; }
public List<string> dbColumnNames = null;
}
class Program
{
static void Main(string[] args)
{
List<BusinessElement> elements = new List<BusinessElement>();
elements.Add(new BusinessElement() { name = "aap", direction = "asc" });
elements.Add(new BusinessElement() { name = "noot", direction = "desc" });
elements.Add(new BusinessElement() { name = "mies", direction = "desc" });
Vullen(elements.Select(x => x.TheDataAccessElement));
}
public static void Vullen(IEnumerable< DataAccessElement> coll)
{
foreach (DataAccessElement da in coll)
{
da.dbColumnNames = new List<string>();
da.dbColumnNames.Add("hoi");
}
Uitlezen(coll);
}
public static void Uitlezen(IEnumerable< DataAccessElement> coll)
{
foreach (DataAccessElement da in coll)
{
if (da.dbColumnNames == null)
{
// Dit zou je niet verwachten, omdat je net in Vullen de dbColumnNames gevuld hebt.
Console.WriteLine("Dit zou je niet verwachten, omdat je net in Vullen de dbColumnNames gevuld hebt.");
Console.ReadLine();
}
}
}
}
}