使用查询语法动态创建 LINQ 查询表达式的方法有哪些?
What are the ways to create the LINQ query expression using query syntax dynamically?
有哪些可能的方法可以动态创建 LINQ 表达式,但使用查询语法?查询语法是否只是 C# 的东西,如果是,是使用 Roslyn 动态编译创建此类表达式的唯一可行方法吗?
当手动编写 LINQ 表达式时,我发现使用方法链语法编写它们更自然,例如 ctx.Foo.Where(foo => foo.Type.Name == "Bar")
但在某些情况下我需要像这样编写它们:
from foo in ctx.Foo
join fooType in ctx.Types on foo.TypeId equals fooType.Id
where fooType.Name == "Bar"
我喜欢表达式树在动态创建表达式时确保类型安全的方式,但是如何使用查询语法创建表达式?
感谢大家的评论。
所以事实证明这是不可能的,因为查询语法只是 C# 语言的语法糖。
此外,如果其他人偶然发现了这个问题,请查看@Gert 的出色回答:
该答案解释了查询语法是 "sugar",而方法语法显示了幕后真正发生的事情,例如 join x in y on z equals x.something into somethingElse
实际上是 GroupJoin
方法调用如果不实际调用 GroupJoin
,就无法用表达式树来表达这一点。
有哪些可能的方法可以动态创建 LINQ 表达式,但使用查询语法?查询语法是否只是 C# 的东西,如果是,是使用 Roslyn 动态编译创建此类表达式的唯一可行方法吗?
当手动编写 LINQ 表达式时,我发现使用方法链语法编写它们更自然,例如 ctx.Foo.Where(foo => foo.Type.Name == "Bar")
但在某些情况下我需要像这样编写它们:
from foo in ctx.Foo
join fooType in ctx.Types on foo.TypeId equals fooType.Id
where fooType.Name == "Bar"
我喜欢表达式树在动态创建表达式时确保类型安全的方式,但是如何使用查询语法创建表达式?
感谢大家的评论。 所以事实证明这是不可能的,因为查询语法只是 C# 语言的语法糖。
此外,如果其他人偶然发现了这个问题,请查看@Gert 的出色回答:
该答案解释了查询语法是 "sugar",而方法语法显示了幕后真正发生的事情,例如 join x in y on z equals x.something into somethingElse
实际上是 GroupJoin
方法调用如果不实际调用 GroupJoin
,就无法用表达式树来表达这一点。