0

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)");

ネストされた値の配列を含めるために、上記の動的クエリを作成するにはどうすればよいですか?

誰かが私にいくつかの良い例の方向を示したり、グループ化と合計の方法を含むいくつかの例を教えてもらえますか?

4

1 に答える 1

0

自分でそれを理解しました。

問題は、単に"Value"を行うべきだった場所の上で"new(Value)"を行っていたことです。それをパラメーターとして使用しているクエリの例を見ました。基本的は現在のアイテムを意味します。

これは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()
              };

動的クエリに変換できる

var myQuery = trans
    .AsQueryable()
    .GroupBy("new(Type)", "Value")
    .Select(@"new((Key.Type == ""A"" ? ""Alfa"" : (Key.Type == ""B"" ? ""Bravo"" : (Key.Type == ""C"" ? ""Charlie"" : (Key.Type == ""D"" ? ""Delta"" : ""Other"")))) as Type, it AS Data)");

それは私に次のような結果を与えるでしょう

myQuery = [{Type:"Alfa", Data: [50,60,10]},{Type:"Bravo", Data: [60,70,40,30]},{Type:"Charlie", Data: [10,30,5,15]}]
于 2013-03-06T00:16:24.503 に答える