我在LINQ JOIN条件中添加字符串连接以及在Oracle sql查询中对其进行转换时遇到了一些问题。在使用EF的旧解决方案中,这一点曾经很好地工作。让我们以下面的示例为例:
var query = (from sub in connection.InvoiceSubStatuses
join lab in connection.Litteral
on "STN_ASP_PIE_STATUT_EXTERNE[" + sub.StatusCode + "]" + "{" + vendorId + "}" equals lab.Code
where sub.IsFlaggedDelete == 0
select new InvoiceSubStatusDTO
{
Description = lab.Libelle,
StatusCode = sub.StatusCode,
Id = sub.Id,
Culture = lab.Culture,
StatusType = sub.StatusType
});
这被解释为以下sql代码:
SELECT "l".LIBELLE "Description", "s".CODE_STATUSFAC "StatusCode", "s".SYS_ID "Id", "l".CULTURE "Culture", "s".TYPE_STATUSFAC "StatusType"
FROM STATUSFAC "s"
INNER JOIN LITTERAUX "l" ON N'STN_ASP_PIE_STATUT_EXTERNE[' || COALESCE("s".CODE_STATUSFAC, N'') || N']' || N'{' || TO_NCHAR(:p__vendorId_0) || N'}' = "l".CODE
WHERE ("s".DIGITAL_LETTER = 1) AND ("s".SYS_FLAG_DEL = 0)
这会导致一个错误,因为Oracle不允许在COALESCE(COALESCE(“s”.CODE_STATUSFAC,N'))中包含'N'文本文字。如果我手动将其更改为COALESCE(“s”.CODE_STATUSFAC,''),查询将正常工作,但我不知道如何从Linq中解决此问题。
是否有人遇到过此问题并找到了解决方法?谢谢
1条答案
按热度按时间bqf10yzr1#
因此,问题是由于DB中的列不可为空,因此当尝试进行字符串连接时,Oracle提供程序会添加COALESCE。因此,为了绕过此问题,我在StatusCode列上添加了属性[Required]。