9

重複の可能性:
LINQ を使用してデータをピボットすることは可能ですか?

Linq でクロス集計スタイルの結果を作成できるかどうか疑問に思っています。次のようなデータがあります。

    var list = new[]
    {
        new {GroupId = 1, Country = "UK", Value = 10},
        new {GroupId = 1, Country = "FR", Value = 12},
        new {GroupId = 1, Country = "US", Value = 18},
        new {GroupId = 2, Country = "UK", Value = 54},
        new {GroupId = 2, Country = "FR", Value = 55},
        new {GroupId = 2, Country = "UK", Value = 56}
    };

そして、次のようなリピーターコントロールに出力しようとしています:

GroupId.....UK.....FR.....US
1...........10.....12.....18
2...........54.....55.....56

私の問題を引き起こしている動的列です。これに対する解決策はありますか?

4

4 に答える 4

4

これらのruntimyの結果を保持するには、runtimyクラスが必要です。xmlはどうですか?

XElement result = new XElement("result",
  list.GroupBy(i => i.GroupId)
  .Select(g =>
    new XElement("Group", new XAttribute("GroupID", g.Key),
      g.Select(i => new XAttribute(i.Country, i.Value))
    )
  )
);

結果セルごとに複数のレコードを期待していますか?もしそうなら、そこにいくつかの合計(およびより多くのグループ化)が必要になります。

(この回答は概念実証であり、最終結果ではありません。列の順序、セルの欠落など、対処すべきいくつかの問題があります)。

于 2008-11-26T15:09:52.337 に答える
1

MSが提供する動的なlinqライブラリを使用してみることができます。それらには、文字列を引数として取る拡張メソッドに対するいくつかのオーバーロードがあります。また、文字列を受け取り、ラムダ式を発行する式パーサーもあります。それらを使用して動的選択を作成できるはずです。

警告の言葉ですが、あなたは一般的なIQueryableではなく非一般的なIQueryableになってしまうので、結果でできることには少し制限があり、型の安全性を少しあきらめるかもしれませんが、それはアプリケーションでOK...

動的なlinqのものへのリンクは

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

ダイナミックライブラリのソースコードをダウンロードできるリンクに加えて、その使用方法の優れたイラストがいくつかあります。

于 2009-04-01T18:33:12.857 に答える
1
var labResults = from lab in CoreLabResults
                 where lab.Patient == 8
                 group lab by new { lab.Patient, lab.TestNo, lab.CollectedDate }
                     into labtests
                     select new
                     {
                         labtests.Key.Patient,
                         labtests.Key.TestNo,
                         labtests.Key.CollectedDate,
                         MCHC = labtests.Where(lab => lab.TestVar == "MCHC").FirstOrDefault().Result,
                         LYABS = labtests.Where(lab => lab.TestVar == "LYABS").FirstOrDefault().Result,
                         TotalTests = labtests.Count()
                     }
于 2009-10-07T09:05:49.763 に答える
1

簡単な検索を行った後、System.Reflection.Emit の ModuleBuilder、TypeBuilder、および FieldBuilder クラスを調べたいと思うかもしれません。これらを使用すると、実行時に動的にクラスを作成できます。それ以外では、オブジェクトをグループ化してから、LINQ から取得した階層的な結果を使用して何かを行う必要があります。実行時に匿名型フィールドを動的に作成する方法がよくわかりません。それはどうする必要があるように思えます。

于 2008-11-26T14:59:41.563 に答える