我有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()
并且没有其他办法吗?
答案 0 :(得分:1)
@Orif我认为您应该尝试手动构建查询,而不是使用LINQ-to-SQL生成器。
尝试使用ExecuteQuery
类上的DataContext
方法并尝试向NVARCHAR
答案 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 ?? "",
});