【问题标题】:String concatenation in dynamic-linq Select动态 linq Select 中的字符串连接
【发布时间】:2018-01-28 11:46:16
【问题描述】:

我正在尝试使用动态 linq 返回一个新列,它是 idname 的串联,中间有一个连字符:

query.Select("new(id, name, id & " - " & name As idName")

但是,即使没有连字符,我什至无法让简单的串联工作:

query.Select("new(id, name, id & name As idName")

这引发了System.NotSupportedException

LINQ to Entities 无法识别 System.String 方法 Concat(System.Object, System.Object) 方法,该方法不能 翻译成商店表达式。

有什么办法可以解决这个问题,如果是这样,我如何以dynamic-linq可以解释的方式将引用部分" - "添加到表达式中,我也想要idname成为变量,因为这些变量会根据用户的选择而变化?

注意:

  • 我正在使用 dynamic-linq,因为我想要连接的列的名称会根据用户的选择而有所不同,而且我已经将 dynamic-linq 用于 Where 子句)。
  • idname 列都是字符串类型

【问题讨论】:

    标签: .net vb.net dynamic-linq


    【解决方案1】:

    System.Linq.Dynamic NuGet 包将https://github.com/kahanu/System.Linq.Dynamic 列为项目页面。 在这里,来自 Scott Guthrie 的 original 2008 blog 关于动态 LINQ 的示例正在转移到 GitHub 项目的 wiki,并且文档正在扩展。

    但是,查看issues list,存储库似乎已死/垂死(discussion here)。目前,最活跃的fork/NuGet package 似乎是 System.Linq.Dynamic.Core(支持 .NET 标准以及 .NET Core)。

    原始System.Linq.Dynamic 中的文档和示例目前更广泛,但两个 wiki 都有一个关于 dynamic expressions 的部分,而 expression language 包括一个关于操作符的部分。这包括串联:

    x & y 字符串连接。操作数可以是任何类型。

    在我的测试中,如果您从 System.Linq.Dynamic NuGet 包切换到 System.Linq.Dynamic.Core 包(您不必使用 .NET Core,它可以与其他版本的 .NET 一起使用好)。

    Imports System.Linq.Dynamic.Core
    
    query.Select("new(id & name As id_name)")
    

    【讨论】:

    【解决方案2】:

    如果我理解正确的话,这应该可以。

    Imports System.Linq.Dynamic.Core
    
    Dim col1 = "id"
    Dim col2 = "name"
    
    Dim results = query.Select($"new({col1} as {col1},
                                     {col2} as {col2},
                                     {col1} & "" - "" & {col2} as {col1}_{col2})")
    

    也许还有其他方法,但你仍然只会查询一次数据库,所以我认为应该没有问题。

    希望对你有帮助...

    【讨论】:

    • 这很接近,但我的列的名称可能会有所不同。 .Id.Name.IdName有什么办法也可以根据用户的选择动态改变吗? (我可以在匿名类型的左侧以某种方式插入字符串吗)?
    • 你的查询对象是什么类型的?你在用 EF 吗?
    • 是的,它是一个 EF6 IQueryable。我正在使用Imports System.Linq.Dynamic 来获得Select 重载,它允许我使用字符串作为选择器。该错误表明正在使用 LINQ to Entities,但我不确定这是否会产生任何影响。
    猜你喜欢
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    相关资源
    最近更新 更多