【问题标题】:Dynamic LINQ to DataTable: why using hardcode string "it" as DataRowDynamic LINQ to DataTable:为什么使用硬编码字符串“it”作为 DataRow
【发布时间】:2013-03-01 17:58:36
【问题描述】:

假设我有一个DataTable,其中包含三列C1C2C3

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 nugetGroupByC1C2 就像下面的代码一样,它工作得很好:

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

如果您注意到,有一个 硬编码字符串 it 表示为 DataRow,我从以下方面得到这个想法:

Dynamic Linq GroupBy

。如果我尝试将 it 更改为字符串 row 例如:

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

我会得到运行时错误:

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

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

【问题讨论】:

    标签: c# linq dynamic-linq


    【解决方案1】:

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

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

    如果您想查看更多详细信息,可以自己检查source 到 LINQ 程序集。

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

    【讨论】:

    • 是的,因为您的动态 LINQ 字符串被编译成 Lambda 表达式,并且需要输入参数。由于您无法指定调用该输入参数的内容,因此他们只需使用关键字“it”来引用可枚举的元素。换句话说,Select("...") 调用被编译成 Select(it => ...)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多