Question

Assume I have a DataTable with three columns C1, C2, C3:

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 GroupBy columns C1 and 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:

Dynamic Linq GroupBy

. 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 it as DataRow? Is there any reason for this.

Was it helpful?

Solution

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: it, iff, and new:

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.)

OTHER TIPS

Well I suppose they had to call the current object in the enumeration 'something', so 'it' seems like a reasonable choice.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top