尝试在最初类型为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来做到这一点。有人可以帮忙吗?
理想情况下,我想在运行时自动确定列类型,并在排序之前应用适当的转换。
答案 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