5

、、のDataTable3 つの列があるとします。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を使用し、以下のコードが好きで、完全に機能します:GroupByC1C2

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

お気づきの場合は、として提示するハードコード文字列 があります。このアイデアは次のように得られます。itDataRow

動的 Linq GroupBy

. itたとえば、文字列に変更しようとするとrow

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

実行時エラーが発生します:

タイプ 'DataRow' にプロパティまたはフィールド 'row' が存在しません

だから、なぜハードコーディング itしなければならないのか、あまり頭がすっきりしませんDataRowか?これには何か理由がありますか。

4

2 に答える 2

1

これが、Dynamic LINQ プロバイダーの記述方法です。LINQ 式を解析しようとするときに認識される 3 つのハードコーディングされたキーワードがあります: itiff、およびnew:

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 に答える