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

时间:2015-01-22 06:50:56

标签: c# oracle linq entity-framework asp.net-mvc-4

我有EF 4,.net 4的asp.net 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中选择它,它会完全正常运行,如: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是NVARCHAR2(30)

如何让linq生成正确的sql?或者我必须在选择之前拨打ToList()并且没有其他办法吗?

2 个答案:

答案 0 :(得分:1)

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

尝试使用ExecuteQuery类上的DataContext方法并尝试向NVARCHAR

添加强制转换

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

答案 1 :(得分:0)

就我而言,问题是空字符串被 Oracle 视为空字符串,因此您的代码 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 ?? "",
         });