【发布时间】:2019-11-15 04:10:35
【问题描述】:
使用查询语法动态创建 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"
我喜欢表达式树在动态创建表达式时如何确保类型安全,但是如何使用查询语法创建表达式?
【问题讨论】:
-
您好,我相信您的问题很简单,但我无法理解您想要什么。我建议您简化事情以便能够帮助您。你可以用例子说我需要 1 2 3。
-
@MohammadAlghanem 感谢您的评论。但是我不确定如何进一步简化这个问题,它实际上是关于是否可以创建 LINQ 查询语法表达式。编辑:查询语法与方法语法见docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…
-
您要创建 Expression 类对象吗? docs.microsoft.com/en-us/dotnet/api/…你能具体说明一下“表达式”是什么吗?
-
我认为不可能。您可以创建一个表达式,该表达式将为您返回
IQueryable<T>,然后您可以调用方法来更改它(Where、ORderBy、GroupBy 等)。我喜欢谓词构建器类,它可以让您轻松使用表达式树。 -
我认为从方法语法到查询语法的逆向工程路径是不可能的,因为方法语法要丰富得多。 IE。所有查询语法都可以编译为表达式树,但并非所有表达式树都具有等效的查询语法。
标签: c# linq linq-to-entities