代码之家  ›  专栏  ›  技术社区  ›  David

使用trim函数参数时的linq实体连接

  •  -1
  • David  · 技术社区  · 7 年前

    我有t.arg,它包含 "abc|efg|xyz" 和b.arg "xyz" 我想在加入时比较它们:

    join t in db.Tdb on b.arg.Substring(b.arg.LastIndexOf('|') + 1)  equals t.arg
    

    我得到以下错误:

    linq to实体无法识别方法“int32 lastindexof(char)” 方法,则无法将此方法转换为存储表达式。

    两个参数都是字符串

    如何解决这个问题?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Jonas Høgh    7 年前

    这意味着lastindexof方法没有内置的linq->t-sql转换。不过,在sql server中也没有直接对应的函数。你必须:

    1. 在数据库中编写标量值的用户定义函数,该函数执行与lastindexof等效的操作
    2. 将用edmFunction属性修饰的包装器方法添加到处理到T-SQL函数的转换的C代码中,如下所述: https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/ef/language-reference/how-to-call-custom-database-functions
        2
  •  0
  •   ProgrammingLlama Raveena Sarda    7 年前

    实际上,您正在尝试编写与sql等价的 bArg = tArg OR bArg LIKE '%|' + tArg . 我相信 .EndsWith 应该为你做到这一点。不幸的是它不可能用在 join 部分,但你可以在 where 部分。

    var result = 
        from b in collection1
        from t in collection2
        where b.arg == t.arg || b.arg.EndsWith("|" + t.arg)
        select new { B = b, T = t };
    

    这个 哪里 这里的子句应该大致相当于您的SQL查询。

    因为你不知道 a == b || EndsWith 与此相关,请考虑以下示例,了解其工作原理:

    • abc|def|ghi 连接 ghi
    • GHI 连接 GHI

    如果我们使用您的方法,我们将从 Substring :

    • ABC定义GHI 变成 GHI
    • GHI ,因为它不包含 | 获取-1的索引,使用+1使其成为0,因此 GHI

    现在,如果我们使用 == EndsWith ?

    • "abc|def|ghi" == "ghi" ,但它确实以 "|ghi" ,所以它满足条件。
    • "ghi" =“吉” ,所以它满足条件。

    Try it online