SQL的LEFT函数在Linq中的等价方法是什么?

5
我们有一个包含一些varchar(max)字段的数据库,这些字段可能包含大量文本。然而,我遇到了这样一种情况:在MVC网站上对于结果表格的“预览”,我只想选择字段中的前300个字符。以下是一个简化的查询示例,其中我想获取所有位置以在表格中显示(这将进行分页处理,因此我不会一次性获取所有内容-每次获取大约10个结果):
return db.locations;

然而,这样会返回一个包含大量文本的位置对象,执行起来非常耗时。

因此,在此之前我采用了使用 SQL 存储过程的方法:

LEFT(field, 300) 

为解决这个问题,我在Linq to SQL .dbml文件中包含了存储过程,以返回结果的"location"对象。
然而,我有许多查询,不想为每个查询都这样做。
这可能是一个简单的解决方案,但我不确定如何用搜索引擎来表述,如果有人能帮我解决这个问题,我将不胜感激。
3个回答

5

您可以使用直接转换为这些函数的函数,当您需要在LINQ中翻译功能上正常的SQL代码时,这非常有用。

请查看System.Data.Objects.EntityFunctions

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

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

哦,谢谢,我会尝试一下,如果“子字符串”不起作用的话。 - CDrnly
2
不幸的是,它只适用于Linq to Entities而不是普通的Linq to SQL,显然会抛出异常。 - CDrnly
1
对于最近的实体框架,您可以使用 System.Data.Entity.DbFunctions.Left(loc.Field,300) - BYISHIMO Audace

3

非常感谢您的回复。是的,我想到了使用substring,但我正在使用对象,即返回“locations”,这意味着我每次都必须使用“select new location { field = field.substring(xyz)等等吗?我甚至不知道它是否有效,但它也是一个具有许多字段的大对象,尽管与大文本字段相比较小,但这意味着每次查询时我都必须单独选择所有字段,如果您明白我的意思的话!针对您其他提到的问题,是的,我目前正在使用存储过程和GUI设计师,就像教程中所介绍的一样。 - CDrnly
我猜想使用 select new location { ...} 并在所需字段上使用 substring 可能是唯一的方法,我认为可能会有更加优雅的方式。 - CDrnly

2
我发现以下方法对我有用:

我发现以下方法对我有用:

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

并不是最理想的方法,因为我需要使用"select new"来返回一个不同的对象,但似乎可以工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接