我有一个包含(可能)长字符串列的表,因此为了避免在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]
答案 0 :(得分:0)
表应该包含在FirstOrDefault方法之前。
var objContentItem = objDataContext.Tablename.FirstOrDefault(x =&gt; x.ID == 2);