C# 创建表达式<;Func<;T、 TKey>&燃气轮机;动态地

C# 创建表达式<;Func<;T、 TKey>&燃气轮机;动态地,c#,entity-framework,linq,c#-4.0,lambda,C#,Entity Framework,Linq,C# 4.0,Lambda,有关: 请考虑此代码< GROPIB/语句: group r by new { r.EmployeeID, r.Name } 如果我想用Lambda版本编写上面的GroupBy语句,并将Expression作为参数传递给它,我如何才能创建Expression?我没有时间让您了解整个过程,但是一般的要点是,您将使用Expression类之外的静态方法构造表达式 例如,new表达式将通过将构造函数信息和一系列表达式等传递给expression.new()重载之一来创建 r=>…的概念体现在Expr

有关:

请考虑此代码< GROPIB/<代码>语句:

group r by new { r.EmployeeID, r.Name }

如果我想用
Lambda
版本编写上面的
GroupBy
语句,并将
Expression
作为参数传递给它,我如何才能创建
Expression

我没有时间让您了解整个过程,但是一般的要点是,您将使用
Expression
类之外的静态方法构造表达式

例如,
new
表达式将通过将构造函数信息和一系列表达式等传递给
expression.new()
重载之一来创建

r=>…
的概念体现在
Expression.Lambda(…)
中,其中传递一个
Expression.Parameter(typeof(T),“r”)
作为Lambda的参数

Expression.MakeMemberAccess
将帮助您生成
r.EmployeeId
r.Name

我发现在LINQPad中转储一个示例表达式并使用如下代码开始是很有用的:

void Main()
{
    DumpExp(r => new { r.EmployeeID, r.Name });
}

public void DumpExp<TKey>(Expression<Func<Foo, TKey>> expr)
{
    expr.Dump();
}

public class Foo
{
    public string EmployeeID;
    public string Name;
}
void Main()
{
DumpExp(r=>new{r.EmployeeID,r.Name});
}
公共void DumpExp(表达式expr)
{
expr.Dump();
}
公开课Foo
{
公共字符串EmployeeID;
公共字符串名称;
}
这将允许您检查树并了解组成树的表达式类型及其属性值。然后您可以尝试编写匹配的代码

一旦您得到了一个您认为可以工作的表达式,您就可以对它调用Compile来生成一个可运行的函数,您可以使用它来测试内存对象上的行为

我猜你的匿名类型可能是问题中最困难的部分。如果目标框架在其GroupBy语句中支持类似元组的内容,那么您可能最好改用元组

有一个古老的项目,其设计目的是让您能够运行通过向类似LINQ的方法提供字符串而构建的动态LINQ语句。它被称为“动态LINQ”,可能适合您的需要


你可能也会发现这很有用。它应该可以帮助您使用更流畅的语法构建表达式树。但是,它似乎没有得到积极的开发。

我没有时间向您介绍整个过程,但总体要点是您将使用
Expression
类中的静态方法构造表达式

例如,
new
表达式将通过将构造函数信息和一系列表达式等传递给
expression.new()
重载之一来创建

r=>…
的概念体现在
Expression.Lambda(…)
中,其中传递一个
Expression.Parameter(typeof(T),“r”)
作为Lambda的参数

Expression.MakeMemberAccess
将帮助您生成
r.EmployeeId
r.Name

我发现在LINQPad中转储一个示例表达式并使用如下代码开始是很有用的:

void Main()
{
    DumpExp(r => new { r.EmployeeID, r.Name });
}

public void DumpExp<TKey>(Expression<Func<Foo, TKey>> expr)
{
    expr.Dump();
}

public class Foo
{
    public string EmployeeID;
    public string Name;
}
void Main()
{
DumpExp(r=>new{r.EmployeeID,r.Name});
}
公共void DumpExp(表达式expr)
{
expr.Dump();
}
公开课Foo
{
公共字符串EmployeeID;
公共字符串名称;
}
这将允许您检查树并了解组成树的表达式类型及其属性值。然后您可以尝试编写匹配的代码

一旦您得到了一个您认为可以工作的表达式,您就可以对它调用Compile来生成一个可运行的函数,您可以使用它来测试内存对象上的行为

我猜你的匿名类型可能是问题中最困难的部分。如果目标框架在其GroupBy语句中支持类似元组的内容,那么您可能最好改用元组

有一个古老的项目,其设计目的是让您能够运行通过向类似LINQ的方法提供字符串而构建的动态LINQ语句。它被称为“动态LINQ”,可能适合您的需要


你可能也会发现这很有用。它应该可以帮助您使用更流畅的语法构建表达式树。但是,它似乎没有得到积极的开发。

@shA.t:不,我很确定他说的“动态”意思是他不想让代码在编译时指定EmployeeID和Name。他想使用运行时已知的信息。谢谢,但我想使用表达式创建
表达式”。请查看引用的链接to@StriplingWarrior是的,你是对的,你在构造这个表达式时有什么信息?您知道哪些值组成组键吗?你知道他们的类型吗?你能包含一些显示示例用例的代码吗?@shA.t:不,我很确定他说的“动态”意思是他不想让代码在编译时指定EmployeeID和Name。他想使用运行时已知的信息。谢谢,但我想使用
表达式创建
表达式”。请查看引用的链接to@StriplingWarrior是的,你是对的,你在构造这个表达式时有什么信息?您知道哪些值组成组键吗?你知道他们的类型吗?你能提供一些显示示例用例的代码吗?很好的回答…关于这个主题有一些文档,如果可能的话,我想请你在这里写上面的陈述。我没有这样使用表达式,如果我能看到一个工作示例,搜索将非常有帮助properly@Arian:我没有时间给你写这篇文章,但你可以看到一个很好的通用示例,你应该能够适应你的情况。回答得很好…关于这个主题有一些文档,如果可能的话,我想请你在这里写下上述声明。我没有这样使用表达式,如果我能看到一个工作示例,搜索将非常有帮助properly@Arian:是的