C# System.Linq.Dynamic-如何从Linq转换为动态语法

C# System.Linq.Dynamic-如何从Linq转换为动态语法,c#,visual-studio-2010,linq,dynamic,C#,Visual Studio 2010,Linq,Dynamic,我正在使用名为System.Linq.Dynamic()的类。它用于定义动态Linq查询。我需要查询是动态的,以便可以在运行时定义它们 我将用一个例子来解释: 存在一个包含事务对象列表的事务对象 public class Transactions : List<Transaction> { public Transactions() { } public Transactions(List<Transaction> trans) : base(trans)

我正在使用名为System.Linq.Dynamic()的类。它用于定义动态Linq查询。我需要查询是动态的,以便可以在运行时定义它们

我将用一个例子来解释: 存在一个包含事务对象列表的事务对象

public class Transactions : List<Transaction>
{
    public Transactions() { }
    public Transactions(List<Transaction> trans) : base(trans) { }
}
public class Transaction
{
    public string Type;
    public int Value;
}
然后,我可以像这样运行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)");
这样做的目的是为特定组提供一个类型为分组类型、总计为求和值的对象。例如,它可能看起来像这样:

mySum = [{Type:"A", Total: 120},{Type:"B", Total: 200},{Type:"C", Total: 60}]
myQuery = [{Type:"Alfa", Data: [50,60,10]},{Type:"Bravo", Data: [60,70,40,30]},{Type:"Charlie", Data: [10,30,5,15]}]
我了解动态查询如何工作的基本原理,但似乎没有任何复杂动态查询的清晰示例包含对正在发生的事情的解释

这是我无法解决的部分。给出以下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()
              };
最终会给我一个这样的结果:

mySum = [{Type:"A", Total: 120},{Type:"B", Total: 200},{Type:"C", Total: 60}]
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)");
如何编写上面的动态查询以包含嵌套的值数组?

谁能给我指出一些好例子的方向,或者给我举一些例子,包括如何分组和求和?我自己想出来了

问题是我在上面做的是“新(价值)”,而我应该做的是“价值”。我看到了一个使用it作为参数的示例查询。基本上,它是指当前项目

这是一个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)");
可以转录成动态查询的

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]}]

如果您想成为动态的,只需
GroupBy
或event
Select
,我发现第二个查询很复杂?我需要使用Linq.dynamic类编写Linq语法,正如我在上面的示例中所尝试的那样。所以基本上需要一些方法来翻译上面的Linq查询,以便动态编写它们。第一个查询是可行的,但第二个似乎不可行。第二个是可行的,因为我已经回答了下面我自己的问题。希望这能帮助其他处于同样情况的人。