假设我有一个DataTable
,其中有三列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");
我使用Dynamic Linq on nuget到GroupBy
列C1
和C2
,如下面的代码所示,它完美无缺:
var output = dt.AsEnumerable()
.AsQueryable()
.GroupBy("new(it[\"C1\"] as C1, it[\"C2\"] as C2)", "it");
如果您注意到,硬编码字符串 it
将显示为DataRow
,我从以下网址获得了这个想法:
。如果我尝试将it
更改为字符串row
,例如:
GroupBy("new(row[\"C1\"] as C1, row[\"C2\"] as C2)", "row");
我会收到运行时错误:
“DataRow”类型中没有属性或字段“行”
所以,我不清楚为什么硬编码 it
为DataRow
?这有什么理由吗。
答案 0 :(得分:1)
这就是动态LINQ提供程序的编写方式。它有三个硬编码关键字,它在尝试解析LINQ表达式时会识别:it
,iff
和new
:
static readonly string keywordIt = "it";
static readonly string keywordIif = "iif";
static readonly string keywordNew = "new";
如果您想查看更多详细信息,可以自行检查source到LINQ程序集。
(BTW:“它”似乎是“标识符令牌”的缩写,如果我不得不猜测的话。)
答案 1 :(得分:0)
我认为他们必须在枚举中调用当前对象'某事',所以'它'似乎是一个合理的选择。