Assume I have a
DataTable with three columns
var dt = new DataTable(); dt.Columns.Add("C1", typeof (int)); dt.Columns.Add("C2", typeof (string)); dt.Columns.Add("C3", typeof(string)); dt.Rows.Add(1, "1", "1"); dt.Rows.Add(1, "1", "2"); dt.Rows.Add(1, "2", "2");
I use Dynamic Linq on nuget to
C2 like the code below and it works perfectly:
var output = dt.AsEnumerable() .AsQueryable() .GroupBy("new(it[\"C1\"] as C1, it[\"C2\"] as C2)", "it");
If you notice, there is a hardcode string
it to present as
DataRow, I get this idea from:
. If I try changing
it to string
row for example:
GroupBy("new(row[\"C1\"] as C1, row[\"C2\"] as C2)", "row");
I will get runtime error:
No property or field 'row' exists in type 'DataRow'
So, I don't clear up my mind much why having to hardcode
DataRow? Is there any reason for this.
That's just how the Dynamic LINQ provider is written. It has three hard-coded keywords that it recognizes when it tries to parse the LINQ expressions:
static readonly string keywordIt = "it"; static readonly string keywordIif = "iif"; static readonly string keywordNew = "new";
You can check the source to the LINQ assembly yourself if you want to see more details.
(BTW: "it" here appears to be short for "identifier token", if I had to guess.)
Well I suppose they had to call the current object in the enumeration 'something', so 'it' seems like a reasonable choice.