【问题标题】:System.Linq.Dynamic - use SELECT inside WHERE statementSystem.Linq.Dynamic - 在 WHERE 语句中使用 SELECT
【发布时间】:2017-04-20 18:41:37
【问题描述】:

我需要像这样使用 System.Linq.Dynamic 动态生成 SQL 查询:

SELECT 
    [Extent1].[FromRevision] AS [FromRevision], 
    [Extent1].[Field1] AS [Field1], 
    [Extent1].[TillRevision] AS [TillRevision], 
    [Extent1].[Field2] AS [Field2], 
    [Extent1].[Date1] AS [Date1], 
    [Extent1].[LastChangeDate] AS [LastChangeDate], 
    [Extent1].[Field3] AS [Field3]
    FROM [log].[MyTable] AS [Extent1]
    WHERE (([Extent1].[FromRevision] <= @p__linq__0) AND ([Extent1].[TillRevision] > @p__linq__1) AND 
    ( NOT EXISTS (SELECT 
        1 AS [C1]
        FROM [log].[MyTable] AS [Extent2]
        WHERE ([Extent2].[Field1] = [Extent1].[Field1]) AND ([Extent2].[FromRevision] <= @p__linq__2) AND ([Extent2].[TillRevision] > @p__linq__3)
    )))

上面的代码是由 Linq 为通用 IQueryable 生成的,像这样:

query.Where(o =>
            //ADDED
            (   o.FromRevision <= tillRevision &&
                o.TillRevision > tillRevision &&
                !query.Any(o1 =>
                    o1.Uid == o.Uid &&
                    o1.FromRevision <= fromRevision &&
                    o1.TillRevision > fromRevision)
            )

但是是否有可能使用 Dynamic Linq 而不是通用的 IQueryable 获得相同的结果、相同的 SELECT 结果?

【问题讨论】:

  • 您是否有理由需要使用 Dynamic Linq 而不是自己构建表达式?
  • 是的,我在设计时不知道这个构造函数、过滤器等会有什么类型。

标签: c# sql linq dynamic-linq


【解决方案1】:

您可以利用可选的params object[] values 参数将一些参数传递给动态查询(如querytillRevisionfromRevision)。然后您可以根据它们的位置在字符串中将它们称为@0@1@2

要访问范围内的当前范围变量,您可以使用it 或什么都不用。它将等同于您的 o 变量。重要的细节是,当您进入嵌套范围(如您的Any)时,在该范围内it 或任何内容都不会引用您的o1 变量的作用。为了访问外部变量,您应该使用outerIt

这是您的查询的 Dynamic LINQ 等效项,希望您能弄清楚如何动态构建它:

var result = query.Where(
    "FromRevision <= @0 && TillRevision > @0 && !@2.Any(Uid == outerIt.Uid && FromRevision <= @1 && TillRevision > @1)",
    tillRevision, // @0
    fromRevision, // @1,
    query // @2
);

【讨论】:

  • 不幸的是,我得到了“MyType”类型中没有属性或字段“outerIt”之类的异常。似乎解析器将我的查询参数转换为真实的对象集合并且不知道是什么“outerIt”是。有任何想法吗?我发现 outerIt 语句存在一些问题,但现在确定是我的情况..
  • 我不知道,它对我有用。可能是您使用的是旧版本?我已经使用 Microsoft 的 System.Linq.Dynamic v1.0.6 进行了测试
  • 显然外层是一些版本实现的原始动态库的扩展,nuget 1.07 版应该有它,尽管在我看来它的实现可能仍然存在错误。
  • 谢谢你,伙计!这行得通,我已经删除了我的本地 DLL 并从 NuGets System.Linq.Dynamic.Core 加载。不知道为什么,但是 System.Linq.Dynamic lib 不起作用,但是 .Core 是可以的!
猜你喜欢
  • 2012-04-28
  • 2011-09-19
  • 2015-07-26
  • 1970-01-01
  • 2013-10-10
  • 2011-01-12
  • 2015-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多