在 LINQ 中将 INT 转换为字符串以进行搜索

convert int to string in linq for searching

提问人:Gordon Copestake 提问时间:1/21/2014 更新时间:4/27/2023 访问量:33231

问:

我希望我的用户能够通过部分字符串搜索采购订单(即 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 实体框架

评论

4赞 Simon Belanger 1/21/2014
尝试直接投射,即.Linq to 实体将遵循某些方法调用,但不是其中之一。直接强制转换在逻辑上等同于 SQL 中的 a。let poid = (string)po.PurchaseOrderIDToStringCAST(X as Type)
0赞 samar 1/21/2014
我在这里回答了类似的问题。一探究竟。stackoverflow.com/questions/21233023/......
0赞 StevieB 1/21/2014
您的问题的解决方案就在这里:stackoverflow.com/questions/1066760/......

答:

0赞 SMI 1/21/2014 #1

Linq 不知道 ToString() 方法是什么,但您可以定义自定义方法。如果您使用此链接,您的问题就会得到解决。

15赞 Bappi Datta 1/21/2014 #2

使用这个:

id = SqlFunctions.StringConvert((double)poid)

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

评论

4赞 Simon Belanger 1/21/2014
这将起作用。但它在代码和后端数据库之间引入了依赖关系(如果 EF 提供程序是 Sql Server,则 SqlFunctions 将起作用),这可能是一个问题,也可能不是问题。
0赞 Gordon Copestake 1/21/2014
Bappi,你的意思是让 poid = SqlFunctions.StringConvert((double)po.PurchaseOrderID),如果是这样,我收到错误 LINQ to Entities 无法识别方法“System.String StringConvert(System.Nullable'1[System.Double])”方法,并且此方法无法转换为存储表达式。
0赞 Sid M 1/21/2014 #3

试试这个

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();

评论

1赞 Gordon Copestake 1/21/2014
这给了我:LINQ to Entities 无法识别方法“System.String StringConvert(System.Nullable'1[System.Double])”方法,并且此方法无法转换为存储表达式。
2赞 Alberto Solano 1/21/2014 #4

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

如果要将 an 转换为 a,并且将 SQL Server 与 EF 配合使用,请按以下方式使用函数 SqlFunctions.StringConvertintstring

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

评论

0赞 Gordon Copestake 1/21/2014
我得到:LINQ to Entities 无法识别方法“System.String StringConvert(System.Nullable'1[System.Double])”方法,并且此方法无法转换为存储表达式。
0赞 Alberto Solano 1/21/2014
您在 EF 中使用哪个提供程序?我更新了我的答案。
0赞 Gordon Copestake 1/22/2014
我正在使用System.Data.SqlClient
5赞 Gordon Copestake 1/21/2014 #5

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

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

正是中间列表使它起作用。

评论

2赞 Ivo Coumans 12/18/2014
我一直在使用 SqlFunctions.StringConvert,但我真的不喜欢创建依赖项。谢谢你的解决方案!
1赞 3/22/2017
ToList 将从数据库中订购和获取所有采购订单,并将它们放入内存中。如果您有很多记录,则会遇到性能问题。在检索记录之前,应先在数据库端筛选记录。使用 Convert.ToString(po.PurchaseOrderID)。包含(术语),如 @Alberto Solano 所述。
2赞 ejhost 12/6/2014 #6

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

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

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