在linq中将int转换为字符串以进行搜索

时间:2014-01-21 11:48:42

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

我希望我的用户能够通过部分字符串搜索采购订单(这是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转换为字符串以使我能够搜索它的片段?

由于

6 个答案:

答案 0 :(得分:14)

使用此:

id = SqlFunctions.StringConvert((double)poid)

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

答案 1 :(得分:4)

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

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

这是使其有效的中间列表。

答案 2 :(得分:2)

您收到该错误是因为您的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

答案 3 :(得分:1)

我偶然发现了这个问题,并希望通过Lambda表达式发布一个可以与Entity Framework和LINQ一起使用的解决方案。

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

试试这个

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