【问题标题】:What are the ways to create the LINQ query expression using query syntax dynamically?动态使用查询语法创建 LINQ 查询表达式的方法有哪些?
【发布时间】: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


【解决方案1】:

感谢大家的 cmets。 所以事实证明这是不可能的,因为查询语法只是 C# 语言的语法糖。

此外,如果其他人偶然发现了这个问题,请查看@Gert 的出色回答:https://stackoverflow.com/a/15599143/828023

该答案解释了查询语法是“糖”,而方法语法显示了幕后真正发生的事情,例如 join x in y on z equals x.something into somethingElse 实际上是 GroupJoin 方法调用,没有办法表达这一点使用表达式树而不实际调用GroupJoin

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 2011-02-18
    • 2015-02-05
    • 1970-01-01
    相关资源
    最近更新 更多