我有一些表格,其中包含“1/2010”,“2/2010”或“13/2010”等列中的年度序列数据。我想通过此列从此表中订购数据。所以我应该创建用于排序的顺序值,就像下面的SQL表达式一样。
-- This code should work if amount of data is less than 1000 record per year.
CAST(SUBSTRING(ReceiveID, 0, CHARINDEX('/', ReceiveID)) AS INT) + 1000 * CAST(SUBSTRING(ReceiveID, CHARINDEX('/', ReceiveID) + 1, 4) AS INT) AS OrderReceiveID
但是,我想用EF 4.0编写这段代码,但是我遇到了一些问题。
首先,我尝试在LINQ查询中创建顺序表达式。但我不能调用字符串到整数转换函数,如“int.Parse”,因为它无法将其转换为SQL语句。
其次,我在数据库中创建标量值函数,用于将年度序列数据的字符串转换为“1/2010”到20100001之类的整数。但我不能将其导入edmx文件,因为它只支持存储过程。
最后,我为这个表创建自定义视图,包括自定义顺序列(对于像2010001这样的数据),我使用其他列来订购此表。一切都很好。但我不喜欢这个,因为我不需要为每个表创建一个视图。
您是否有任何想法在没有触摸数据库的情况下解决此问题或创建共享函数以将序列数据转换为整数值,就像我的第二个想法一样?
谢谢,
答案 0 :(得分:0)
您可以尝试使用ExecuteStoreQuery方法 在这种情况下,您将能够使用上述方法进行排序(并执行任何其他本机SQL) 代码如下:
var q = context.ExecuteStoreQuery("SELECT ReceiveID, SomeField, SomeOtherField, ... from Model1.MyEntity order by CAST(SUBSTRING(ReceiveID, 0, CHARINDEX('/', ReceiveID)) AS INT) + 1000 * CAST(SUBSTRING(ReceiveID, CHARINDEX('/', ReceiveID) + 1, 4) AS INT)");