5

假设我有一个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");

在 nuget to GroupBycolumns上使用 Dynamic Linq C1C2就像下面的代码一样,它工作得很好:

 var output = dt.AsEnumerable()
            .AsQueryable()
            .GroupBy("new(it[\"C1\"] as C1, it[\"C2\"] as C2)", "it");

如果您注意到,有一个硬编码字符串 it可以显示为DataRow,我的这个想法来自:

动态 Linq GroupBy

. 如果我尝试更改it为字符串row,例如:

GroupBy("new(row[\"C1\"] as C1, row[\"C2\"] as C2)", "row");

我会得到运行时错误:

“DataRow”类型中不存在属性或字段“行”

所以,我不太清楚为什么必须硬编码 itDataRow?这有什么原因吗。

4

2 回答 2

1

这就是动态 LINQ 提供程序的编写方式。它具有三个硬编码关键字,当它尝试解析 LINQ 表达式时会识别这些关键字:itiffnew

static readonly string keywordIt = "it";
static readonly string keywordIif = "iif";
static readonly string keywordNew = "new";

如果您想查看更多详细信息,可以自己检查 LINQ 程序集的源代码。

(顺便说一句:如果我不得不猜测的话,这里的“它”似乎是“标识符令牌”的缩写。)

于 2013-03-01T18:04:12.413 回答
0

好吧,我想他们不得不将枚举中的当前对象称为“某物”,因此“”似乎是一个合理的选择。

于 2013-03-01T18:03:20.920 回答