【问题标题】:convert int to string in linq for searching在linq中将int转换为字符串以进行搜索
【发布时间】:2014-01-21 11:48:41
【问题描述】:

我希望我的用户能够通过部分字符串搜索采购订单(即 INT),即如果采购订单是 123456,输入 456 会在结果中给我 123456。

我认为这会起作用:

        var pop = (from po in ctx.PurchaseOrders
               let poid = po.PurchaseOrderID.ToString()
               where poid.Contains(term)
               select new SearchItem
               {
                   id = poid,
                   label = po.SupplierID,
                   category = "purchaseorder"
               }).ToList();

但我得到一个错误

LINQ to Entities does not recognize the method 'System.String ToString()' method, and this method cannot be translated into a store expression.

如何将 INT PurchaseOrderID 转换为字符串,以便搜索其中的片段?

谢谢

【问题讨论】:

标签: c# asp.net linq entity-framework


【解决方案1】:

使用这个:

id = SqlFunctions.StringConvert((double)poid)

更多:http://msdn.microsoft.com/en-us/library/dd487127.aspx

【讨论】:

  • 这行得通。但它在代码和后端数据库之间引入了依赖关系(如果 EF 提供程序是 Sql Server,SqlFunctions 将起作用),这可能是也可能不是问题。
  • Bappi,你的意思是让 poid = SqlFunctions.StringConvert((double)po.PurchaseOrderID) 如果这样我得到一个错误 LINQ to Entities 无法识别方法 'System.String StringConvert(System.Nullable `1[System.Double])' 方法,并且该方法不能翻译成存储表达式。
【解决方案2】:

为了将来参考,请使用以下方法修复此问题:

    var pop = ctx
    .PurchaseOrders
    .OrderBy(x => x.PurchaseOrderID)
    .ToList()
    .Select(x => new SearchItem()
    {
        id = x.PurchaseOrderID.ToString(),
        label = x.SupplierID,
        category = "purchaseorder"
    });

是中间列表使它起作用。

【讨论】:

  • 我一直在使用 SqlFunctions.StringConvert,但我真的不喜欢创建依赖项。感谢您提供此解决方案!
  • ToList 将从数据库中订购并获取所有采购订单并将它们放入内存中。如果你有很多记录,你会遇到性能问题。在检索它们之前,您应该在数据库端过滤您的记录。使用 Convert.ToString(po.PurchaseOrderID).Contains(term) 正如@Alberto Solano 所描述的那样。
【解决方案3】:

您收到该错误是因为您的 LINQ to SQL 无法识别 ToString() 方法。

如果要将int 转换为string 并且您正在使用带有EF 的SQL Server,请以这种方式使用函数SqlFunctions.StringConvert

let poid = SqlFunctions.StringConvert((double)po.PurchaseOrderID);

或者这个,作为替代:

where Convert.ToString(po.PurchaseOrderID).Contains(term)

问题是我们不知道您在 EF 中使用的提供程序是什么。对于 SQL Server,这将起作用,但如果提供程序不同,例如 MySQL,使用该表达式,应用程序将抛出异​​常并显示以下消息:

在类型上指定方法 System.String StringConvert 'System.Data.Objects.SqlClient.SqlFunctions' 无法翻译成 一个 LINQ to Entities 存储表达式。

小心!

如果您不使用 SQL Server 作为提供程序,请在查询中使用显式强制转换,正如 @SimonBelanger 所建议的那样:

let poid = (string)po.PurchaseOrderID

【讨论】:

  • 我得到:LINQ to Entities 无法识别方法 'System.String StringConvert(System.Nullable`1[System.Double])' 方法,并且此方法无法转换为存储表达式。
  • 您在 EF 中使用的是哪个提供程序?我更新了我的答案。
  • 我正在使用 System.Data.SqlClient
  • @GordonCopestake 更新了答案。
【解决方案4】:

我偶然发现了这个问题,并想发布一个解决方案,该解决方案将通过 Lambda 表达式与实体框架和 LINQ 一起使用。

 db.PurchaseOrders.AsEnumerable()
 .Where(x => x.PurchaseOrderID.ToString().Contains(term))
 .ToList();

这是从这里的解决方案中借来的 --> https://stackoverflow.com/a/21234785/2395030

【讨论】:

    【解决方案5】:

    Linq 不知道 ToString() 方法是什么,但是您可以定义您的自定义方法。如果你使用this link,你的问题就解决了。

    【讨论】:

      【解决方案6】:

      试试这个

      var pop = (from po in ctx.PurchaseOrders
                     let poid = SqlFunctions.StringConvert((double)po.PurchaseOrderID)
                     where poid.Contains(term)
                     select new SearchItem
                     {
                         id = poid,
                         label = po.SupplierID,
                         category = "purchaseorder"
                     }).ToList();
      

      【讨论】:

      • 这给了我:LINQ to Entities 无法识别方法 'System.String StringConvert(System.Nullable`1[System.Double])' 方法,并且此方法无法转换为存储表达式.
      猜你喜欢
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 2014-06-11
      • 2013-02-28
      • 2011-11-16
      • 1970-01-01
      相关资源
      最近更新 更多