在尝试使用Linq Entity Framework查询某些数据时,我收到以下异常:
{"Conversion failed when converting the varchar value '3208,7' to data type int."}
令人困惑的是,这个值甚至不存在于我查询的视图中。但是,它确实存在于视图所基于的表中。我正在运行的查询如下:
return context.vb_audit_department
.Where(x => x.department_id == department_id && x.version_id == version_id)
.GroupBy(x => new { x.action_date, x.change_type, x.user_ntid, x.label })
.Select(x => new
{
action_date = x.Key.action_date,
change_type = x.Key.change_type,
user_ntid = x.Key.user_ntid,
label = x.Key.label,
count = x.Count(),
items = x
})
.OrderByDescending(x => x.action_date)
.Skip(startRowIndex)
.Take(maximumRows)
.ToList();
有人可以解释为什么LINQ查询基础表而不是实际视图,以及是否有解决此问题的方法?
答案 0 :(得分:1)
Linq to SQL / EF 不查询基础表而不是视图。它不了解这些信息。
该错误来自SQL Server本身。看起来可能使用某些行失败的CAST
来定义视图。完全可能以这种方式定义视图,这样只有当你尝试SELECT
时它才会失败,并且你会收到确切的错误信息。
演示:
CREATE TABLE Test
(
Value varchar(50)
)
INSERT Test (Value) VALUES ('1')
CREATE VIEW TestView AS
SELECT CAST(Value AS int) AS Value
FROM Test
SELECT * FROM TestView -- Succeeds
INSERT Test (Value) VALUES ('Some String')
SELECT * FROM TestView -- Will fail with your error message
所以,再次,如果你确定这个坏的值根本不应该出现在视图中,那么问题很可能就在于视图本身。要么您的EF映射错误(即您为其中一列定义了错误的类型)。这也可能导致该错误,因为EF将插入CAST
。
答案 1 :(得分:0)
在我们回答你最后一个问题之前,我们需要更多地了解linq查询正在执行的上下文(如果EF或LinqToSql如何定义映射)