我们有一个数据库,其中包含一些varchar(max)字段,其中可能包含大量文本但是我有一种情况,我只想从字段中选择第一个例如300个字符作为分页表的结果MVC网站,用于“预览”该领域。
是一个简化的示例查询,我想让所有位置显示在表中 (这将是分页,所以我不只是得到一切 - 我一次可能得到10个结果):
return db.locations;
然而,这给了我一个位置对象,其中所有字段都包含大量文本,这些文本执行起来非常耗时。
所以我之前采用的是使用SQL存储过程:
LEFT(field, 300)
解决此问题,然后在Linq to SQL .dbml文件中包含存储过程以返回结果的“location”对象。
但是我有很多查询,我不想为每个查询都这样做。
这可能是一个简单的解决方案,但我不确定如何在搜索引擎上说出这一点,我很感激能帮助我解决这个问题的人。
答案 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”来返回一个不同的对象,但它似乎有效。