System.Linq.Dynamic(http://msdn.microsoft.com/en-us/vstudio//bb894665.aspx)というクラスを使用しています。動的Linqクエリを定義するために使用されます。クエリを動的にして、実行時に定義できるようにする必要があります。
例を使用して説明します。Transactionオブジェクトのリストを含むTransactionsオブジェクトがあります。
public class Transactions : List<Transaction>
{
public Transactions() { }
public Transactions(List<Transaction> trans) : base(trans) { }
}
public class Transaction
{
public string Type;
public int Value;
}
Transactionsオブジェクトを宣言し、それにデータを入力するとします。
Transactions trans = new Transactions
{
new Transaction {
Type = "A",
Value = 20,
},
new Transaction {
Type = "B",
Value = 34,
},
... and so on
};
次に、次のようにLinqクエリを実行して、transからデータを抽出できます。
var mySum = from tran in trans
group tran by tran.Type into tranGroup
select new
{
Type = tranGroup.Key,
Total = tranGroup.Sum(s => s.Value)
};
これは(それほど簡単ではありませんが)次の動的クエリに転記できます
var mySum = trans
.AsQueryable()
.GroupBy("new(Type)", "new(Value)")
.Select("new(Key.Type as Type, Sum(Value) as Total)");
これが行うことは、グループ化されたタイプとしてTypeを持ち、特定のグループの合計値としてTotalを持つオブジェクトを与えることです。たとえば、次のようになります。
mySum = [{Type:"A", Total: 120},{Type:"B", Total: 200},{Type:"C", Total: 60}]
動的クエリがどのように機能するかの基本は理解していますが、何が起こっているのかについての説明を含む複雑な動的クエリの明確な例はないようです。
これは私が解決できない部分です。次のLinqクエリがあるとします。
var myQuery = from tran in trans
group tran by tran.Type into tranGroup
select new
{
Type = (tranGroup.Key == "A" ? "Alfa" : (tranGroup.Key == "B" ? "Bravo" : (tranGroup.Key == "C" ? "Charlie" : (tranGroup.Key == "D" ? "Delta" : "")))),
Data = (from tranValue in tranGroup
select tranValue.Value).ToList()
};
最終的には次のような結果が得られます。
myQuery = [{Type:"Alfa", Data: [50,60,10]},{Type:"Bravo", Data: [60,70,40,30]},{Type:"Charlie", Data: [10,30,5,15]}]
これは動的に書き込まれる方法ですが、ネストはありません:
var myQuery = trans
.AsQueryable()
.GroupBy("new(Type)", "new(Value)")
.Select(@"new((Key.Type == ""A"" ? ""Alfa"" : (Key.Type == ""B"" ? ""Bravo"" : (Key.Type == ""C"" ? ""Charlie"" : (Key.Type == ""D"" ? ""Delta"" : ""Other"")))) as Type, """" AS Data)");
ネストされた値の配列を含めるために、上記の動的クエリを作成するにはどうすればよいですか?
誰かが私にいくつかの良い例の方向を示したり、グループ化と合計の方法を含むいくつかの例を教えてもらえますか?