我希望我的用户能够通过部分字符串搜索采购订单(这是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转换为字符串以使我能够搜索它的片段?
由于
答案 0 :(得分:14)
使用此:
id = SqlFunctions.StringConvert((double)poid)
答案 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();