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
添加强制转换
在我的例子中,问题是 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 ?? "",
});
我有 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
在我的例子中,问题是 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 ?? "",
});