Linq查询在EF4.2中的计算列上报告“无效列名”

时间:2012-01-06 11:56:12

标签: linq entity-framework

我有一个包含(可能)长字符串列的表,因此为了避免在LINQ查询期间仅为了检查长度而拉入整个字符串,我使用以下公式在名为HasContent的表中创建了一个计算列:

(case when len([Html])>(0) then CONVERT([bit],(1),0) else CONVERT([bit],(0),0) end)

生成布尔(又名SQL Bit )结果。

在Database-first EF4.2 edmx文件中,我获得了SSDL内容:

<Property Name="HasContent" Type="bit" StoreGeneratedPattern="Computed" />

在CSDL内容中:

<Property Type="Boolean" Name="HasContent" Nullable="false" annotation:StoreGeneratedPattern="Computed" />

并在CS-Mapping中:

<ScalarProperty Name="HasContent" ColumnName="HasContent" />

我在EF中使用DbContext而不是ObjectContext,并且该类包含(没有任何注释)HasContent的布尔属性。

为了测试,我创建了一个简单的LINQ查询:

var objContentItem = objDataContext.FirstOrDefault(x => x.ID == 2);

解决方案编译时没有错误,但执行上述查询会引发错误:

System.Data.EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details. ---> System.Data.SqlClient.SqlException: Invalid column name 'HasContent'.

为什么这应该发生是一个谜,但我想知道是否还有其他我应该做的事情(例如,在伙伴类中注释)以使该列对LINQ可见。

编辑:

SQL Server Profiler BatchCompleted结果:

SELECT TOP (1) 
[Extent1].[ID] AS [ID], 
[Extent1].[Html] AS [Html], 
[Extent1].[HasContent] AS [HasContent]
FROM [dbo].[ContentItems] AS [Extent1]
WHERE 2 = [Extent1].[ID]

1 个答案:

答案 0 :(得分:0)

表应该包含在FirstOrDefault方法之前。

var objContentItem = objDataContext.Tablename.FirstOrDefault(x =&gt; x.ID == 2);