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

问题描述 投票:0回答:7

我希望我的用户能够通过部分字符串搜索采购订单(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
7个回答
15
投票

使用这个:

id = SqlFunctions.StringConvert((double)poid)

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


5
投票

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

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

这是使它起作用的中介列表。


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

2
投票

我偶然发现了这个问题,想发布一个解决方案,该解决方案将通过 Lambda 表达式与 Entity Framework 和 LINQ to entities 一起工作。

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

这里借用了解决方案 --> https://stackoverflow.com/a/21234785/2395030


0
投票

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


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

0
投票

这是另一种可能最简单的方法

.ToString("D1")

例子

var items = from c in contacts
            select new ListItem
            {
                Value = c.ContactId.ToString("D1"),
                Text = c.Name
            };
© www.soinside.com 2019 - 2024. All rights reserved.