3つの列C1
、 C2
、 C3
を持つDataTable
があると仮定しDataTable
。
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");
以下のコードのように、 GroupBy
列C1
およびC2
nugetでDynamic Linqを使用すると、完全に機能します。
var output = dt.AsEnumerable()
.AsQueryable()
.GroupBy("new(it[\"C1\"] as C1, it[\"C2\"] as C2)", "it");
あなたが気付いた場合、 打ち文字列がありit
として提示しDataRow
、私がこのアイデアを得ます:
。たとえば、文字列row
変更しようとするit
ようになります。
GroupBy("new(row[\"C1\"] as C1, row[\"C2\"] as C2)", "row");
ランタイムエラーが発生します。
タイプ「DataRow」にプロパティまたはフィールド「行」が存在しません
だから、私はit
をDataRow
としてハードコード it
なければならない理由をあまり明確にしていません。これには何らかの理由があります。
これがDynamic LINQプロバイダーの記述方法です。 LINQ式を解析しようとしたときに認識する3つのハードコーディングされたキーワード、 it
、 iff
、およびnew
ます。
static readonly string keywordIt = "it";
static readonly string keywordIif = "iif";
static readonly string keywordNew = "new";
詳細を確認したい場合は、LINQアセンブリのソースを自分で確認できます。
(ところで、私が推測しなければならなかった場合、ここでの「it」は「identifier token」の略であるように見えます。)