Linq相当于SQL LEFT函数?

时间:2011-05-08 13:19:43

标签: linq linq-to-sql

我们有一个数据库,其中包含一些varchar(max)字段,其中可能包含大量文本但是我有一种情况,我只想从字段中选择第一个例如300个字符作为分页表的结果MVC网站,用于“预览”该领域。

是一个简化的示例查询,我想让所有位置显示在表中 (这将是分页,所以我不只是得到一切 - 我一次可能得到10个结果):

return db.locations;

然而,这给了我一个位置对象,其中所有字段都包含大量文本,这些文本执行起来非常耗时。

所以我之前采用的是使用SQL存储过程:

LEFT(field, 300) 

解决此问题,然后在Linq to SQL .dbml文件中包含存储过程以返回结果的“location”对象。

但是我有很多查询,我不想为每个查询都这样做。

这可能是一个简单的解决方案,但我不确定如何在搜索引擎上说出这一点,我很感激能帮助我解决这个问题的人。

3 个答案:

答案 0 :(得分:5)

您也可以使用直接转换为这些函数的函数,当您需要转换在SQL中功能正常但在LINQ中没有风险的代码时,这非常有用。 看看System.Data.Objects.EntityFunctions

Locations.Select(loc=>System.Data.Objects.EntityFunctions.Left(loc.Field,300))

这将直接转换为服务器端的LEFT

答案 1 :(得分:3)

编辑:我误读了LEFT LTRIM。这是所有String functions that can't be used in LINQ to SQL。你试过String.Substring()吗?

您最好的选择是映射存储过程并继续使用它。 Here is an excellent article with screen shots向您展示如何操作。

如果您没有使用设计器工具you can also call ExecuteCommand against the DataContext。它不漂亮,但它是我们现在所拥有的。

答案 2 :(得分:2)

我发现这样的东西对我有用:

return from locationPart in db.locations
       select new LocationPart
       {                       
         Description = locationPart.description,
         Text = locationPart.text.Substring(0,300)                       
       };

不理想,因为我必须使用“select new”来返回一个不同的对象,但它似乎有效。