不存在的值上的C#Linq实体转换错误?

时间:2010-04-09 19:22:23

标签: c# linq

在尝试使用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查询基础表而不是实际视图,以及是否有解决此问题的方法?

2 个答案:

答案 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如何定义映射)