我希望我的用户能够通过部分字符串搜索采购订单(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 转换为字符串以便搜索它的片段?
谢谢
使用这个:
id = SqlFunctions.StringConvert((double)poid)
为了将来参考,已使用以下方法修复此问题:
var pop = ctx
.PurchaseOrders
.OrderBy(x => x.PurchaseOrderID)
.ToList()
.Select(x => new SearchItem()
{
id = x.PurchaseOrderID.ToString(),
label = x.SupplierID,
category = "purchaseorder"
});
这是使它起作用的中介列表。
您收到该错误是因为您的 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
我偶然发现了这个问题,想发布一个解决方案,该解决方案将通过 Lambda 表达式与 Entity Framework 和 LINQ to entities 一起工作。
db.PurchaseOrders.AsEnumerable()
.Where(x => x.PurchaseOrderID.ToString().Contains(term))
.ToList();
这里借用了解决方案 --> https://stackoverflow.com/a/21234785/2395030
Linq 不知道 ToString() 方法是什么,但是您可以定义自定义方法。如果你使用这个链接,你的问题就解决了。
试试这个
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();
这是另一种可能最简单的方法
.ToString("D1")
例子
var items = from c in contacts
select new ListItem
{
Value = c.ContactId.ToString("D1"),
Text = c.Name
};