LINQ实体在使用修剪功能进行参数化时加入

时间:2018-10-09 09:03:45

标签: c# linq join trim

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

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

我遇到以下错误:

  

LINQ to Entities无法识别方法'Int32 LastIndexOf(Char)'       方法,并且该方法无法转换为商店表达式。'

两个参数都是字符串

该怎么办才能解决这个问题?

2 个答案:

答案 0 :(得分:1)

这意味着LastIndexOf方法没有内置的Linq-> T-SQL转换。 AFAIK,SQL Server中也没有直接对应的功能。您将必须:

  1. 在数据库中编写一个标量值用户定义的函数,该函数执行与LastIndexOf等效的操作
  2. 在您的C#代码中添加一个装饰有EdmFunction属性的包装器方法,以处理到T-SQL函数的转换,如下所述:https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/ef/language-reference/how-to-call-custom-database-functions

答案 1 :(得分:0)

基本上,您正在尝试编写等效于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 };

此处的where子句应大致等同于您的SQL查询。

由于您没有看到a == b || EndsWith的相关性,请考虑以下示例以了解其工作原理:

  • abc|def|ghi加入ghi
  • ghi加入ghi

如果我们使用您的方法,则将从您的Substring中获得以下结果:

  • abc|def|ghi成为ghi
  • ghi,因为它不包含|的索引为-1,而索引号为+ 1使其为0,因此它简单地变成了ghi

现在,如果我们使用==EndsWith会发生什么?

  • "abc|def|ghi"不是== "ghi",但它以"|ghi"结尾,因此满足条件。
  • "ghi"== "ghi",因此它满足条件。

Try it online