使用Linq to Entities将列转换为可排序的数据类型(如果可能,自动生成)

时间:2014-07-08 19:30:36

标签: sorting casting linq-to-entities

尝试在最初类型为Text的Linq to Entities列上应用排序时,出现以下错误:

The text, ntext, and image data types cannot be compared or sorted, except when 
using IS NULL or LIKE operator 

我知道这是由于列数据类型不可排序而且在纯SQL中我可以通过将其转换为可排序的东西来轻松解决它:

cast(ColumnName as varchar(MAX))

但是我不知道如何使用Linq来做到这一点。有人可以帮忙吗?

理想情况下,我想在运行时自动确定列类型,并在排序之前应用适当的转换。

1 个答案:

答案 0 :(得分:1)

您可以通过转换以下链接中建议的值来暗示Linq中的投射: How can linq to sql be forced to convert ntext column into nvarchar(max) in the generated sql?

或者

您可以创建一个View,它明确选择您已映射的实体的基础表上的所有列,并在视图中强制转换该值。然后,您将重新映射实体以指向视图。

create view dbo.MyView
as

    select ID, cast(Value as varchar(max)) [Value] from dbo.MyTable 

go

select * from dbo.MyTable order by Value

但是,您需要在实体上映射INSERT和UPDATE存储过程,或者在视图上创建INSTEAD OF INSERT / UPDATE触发器,因为对视图施加了以下错误限制:

Update or insert of view or function 'dbo.MyView' failed because it contains a derived or constant field.

插入触发器示例:

CREATE TRIGGER dbo.MyView_InsTrigger on dbo.MyTable
    INSTEAD OF INSERT
AS 
BEGIN

    SET NOCOUNT ON;

    INSERT INTO dbo.MyTable (ID, Value)
    SELECT ID, Value FROM inserted

END
GO