【问题标题】:Linq equivalent of SQL LEFT function?Linq相当于SQL LEFT函数?
【发布时间】:2011-05-08 13:19:42
【问题描述】:

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

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

return db.locations;

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

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

LEFT(field, 300) 

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

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

这可能是一个简单的解决方案,但我不知道如何在搜索引擎上表达这一点,如果有人能帮助我解决这个问题,我将不胜感激。

【问题讨论】:

    标签: linq linq-to-sql


    【解决方案1】:

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

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

    这将在服务器端直接翻译成LEFT

    【讨论】:

    • 哦,谢谢,我会试试这个,如果“substring-ing”不起作用,我会看看它是否有效
    • 不幸的是,它只适用于 Linq to Entities 而不是普通的旧 Linq to SQL,因为它会抛出异常。
    • 最近的实体框架可以使用System.Data.Entity.DbFunctions.Left(loc.Field,300)
    【解决方案2】:

    编辑:我将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。它不漂亮,但它是我们现在拥有的。

    【讨论】:

    • 非常感谢您的回复,是的,我想到使用子字符串,但我正在使用对象,即返回“位置”,这意味着我必须使用“选择新位置 { field = field. substring(xyz) 等?每次我询问您是否理解我时,这些字段都会单独显示!。作为对您的其他观点的回应,是的,我目前正在像教程一样使用 GUI 设计器的存储过程。
    • 我猜使用 select new location { ...} 并在必填字段上使用子字符串可能是唯一的方法,我想我认为可能有更优雅的方法。
    【解决方案3】:

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

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

    不理想,因为我必须使用“选择新”来返回不同的对象,但它似乎工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-25
      • 2011-01-07
      • 1970-01-01
      • 2023-02-23
      • 1970-01-01
      • 2014-04-05
      相关资源
      最近更新 更多