C# ??运算符和 ora-12704: 字符集不匹配

C# ?? operator and ora-12704: character set mismatch

我有 asp.net 带 EF 4、.net 4 的 mvc 4 应用程序 此代码

public List<ListItem> GetViolatedArticlesByLaw(int lawId, string culture)
{
        culture = culture.ToLower();

        var ans = 
            (from art in context.TITLENORMALAWs.Where(l => l.PARENTID == lawId)
            select new ListItem
            {
                ID = art.ID,
                ParentID = lawId,
                Value = (art.NUM_STATSTR ?? ""),
            });
        Debug.WriteLine( ((System.Data.Objects.ObjectQuery)ans).ToTraceString() );

        return ans.ToList();
}

抛出 ora-12704:字符集不匹配。 如果我从 List 中 select,它运行得很好,像这样:from art in context.TITLENORMALAWs.Where(l => l.PARENTID == lawId).ToList()

这是SQL生成的:

SELECT 
"Extent1"."ID" AS "ID", 
:p__linq__1 AS "C1", 
CASE WHEN ("Extent1"."NUM_STATSTR" IS NULL) THEN '' ELSE "Extent1"."NUM_STATSTR" END AS "C2"
FROM "AISSMK"."TITLENORMALAW" "Extent1"
WHERE ("Extent1"."PARENTID" = :p__linq__0)

它在 sqldeveloper 中产生了相同的错误,如果我将此 THEN '' ELSE 更改为此 THEN n'' ELSE 它运行正常。 NUM_STATSTR 在 table 定义中是 NVARCHAR2(30)

如何让 linq 生成正确的 sql?或者我必须在 selecting 之前调用 ToList() 并且没有其他方法吗?

@Orif 我认为您应该尝试手动构建查询而不是使用 LINQ-to-SQL 生成器。

尝试在 DataContext class 上使用 ExecuteQuery 方法并尝试向 NVARCHAR

添加强制转换

如需更多帮助,请阅读此处,https://social.msdn.microsoft.com/Forums/en-US/20d456f0-9174-4745-bbc5-571f68879e27/net-strings-sql-paramater-type-always-nvarchar?forum=linqtosql

在我的例子中,问题是 Oracle 将空字符串视为 null,因此您的代码 Value = (art.NUM_STATSTR ?? "") 实际上最终看起来像 Value = (art.NUM_STATSTR ?? null)。我们的解决方法如下所示:

    var ans = 
        (from art in context.TITLENORMALAWs
         where art.PARENTID == lawId
         select new
         {
            ID = art.ID,
            ParentID = lawId,
            Value = (art.NUM_STATSTR ?? ""),
         })
         .ToList()
         .Select(a => new ListItem{
             ID = a.ID,
             ParentID = a.ParentID,
             Value = a.Value ?? "",
         });